Jenkins is designed from the ground up to be extensible. Most functionality in Jenkins—from source code management and build tools to user interface enhancements and notification systems—is implemented as plugins.
Jenkins defines numerous extension points (interfaces or abstract classes) that model aspects of its behavior.
Plugins implement these extension points and mark their implementations with @Extension.
Plugins are packaged as .hpi/.jpi archives (see Build Process).
At compile time, an annotation processor (SezPoz) records @Extension classes in an index inside the plugin (see Annotation Processing).
During startup, Jenkins reads this index to find and instantiate the extensions, rather than scanning classes reflectively.
Jenkins loads each enabled plugin in its own class loader, which delegates to Jenkins core and to the class loaders of the plugins it depends on. A plugin can therefore use classes from Jenkins core and from its dependencies, including third-party libraries those dependencies bundle. See Dependencies and Class Loading for details.
Plugins participate across all major Jenkins subsystems just like built-in classes:
Persistence: Plugin data is persisted using XStream as XML files in JENKINS_HOME. Plugin developers must preserve backward compatibility explicitly as their classes evolve; see Persistent Objects.
Web Views: Plugins provide UI views using Jelly or Groovy that render seamlessly within the Jenkins UI layout.
HTTP Routing: Plugins can bind methods and objects to URLs via Stapler to expose REST endpoints or web pages.
Static Assets: Plugins can serve static resources such as icons, images, JavaScript, and CSS.
To learn more about developing Jenkins plugins, explore the following topics:
Build Process - How plugins are built with Maven, the Jenkins plugin parent POM, and the Maven HPI plugin. Plugins can also be built with the Gradle JPI plugin, though some capabilities may lag behind the Maven build (see Dependencies and Class Loading).
Choosing a Jenkins Baseline - How to select the minimum Jenkins version for your plugin.
Dependencies and Class Loading - Managing plugin dependencies and understanding class loader boundaries.
Dependency Management - Using the Jenkins Plugin BOM (Bill of Materials) for dependency alignment.
Pipeline Integration - Integrating your plugin with Jenkins Pipeline steps.