Project goal: Explore ways OpenRewrite recipes can be used for Jenkins plugin modernization or automation of plugin build metadata updates
Skills to study/improve: OpenRewrite, Java, Plugin hygiene and migration
OpenRewrite enables large-scale distributed source code refactoring for framework migrations, vulnerability patches, and API migrations via large-scale automated source code refactoring. While the original focus was on the Java language, OpenRewrite is continuously expanding language and framework coverage. The contributor will develop recipes to perform Jenkins plugin hygiene and migration tasks. It is hoped that through the completion of this project, the contributor will pick up skills in Java, OpenRewrite, and Jenkins plugin development.
The Jenkins ecosystem combines a monolithic core with a modular plugin system. True, this design provides a great degree of flexibility and robustness, yet also it poses challenges to propagating large-scale changes throughout the ecosystem. The lack of automation has led to many plugins falling behind with regard to ecosystem-wide migrations. This project proposes the creation of a new tool to apply generic transformations across the Jenkins ecosystem.
Example transformations include:
Ensuring that each plugin has a Jenkinsfile that conforms to the latest best practices from the Jenkins infrastructure team, including the use of containerized builds
Keeping the minimum Jenkins version reasonably current
Updating the plugin parent POM to the latest version
Migrating from explicit dependency versions to the Jenkins plugin BOM
Enabling incrementals
Updating plugin SCM URLs to conform to the latest GitHub best practices
Migrating from HTTP to HTTPs URLs wherever possible
Converting API dependencies to plugin dependencies
Replacing transitional <table>-based markup with <div>-based markup
Replacing JSR 305 annotations with SpotBugs annotations
Replacing deprecated JUnit assertions with Hamcrest assertions
Replacing deprecated Mockito method calls with non-deprecated equivalents
Replacing deprecated HTMLUnit method calls with non-deprecated equivalents
Migrating from JUnit 3 to JUnit 4
Replacing HudsonTestCase with JenkinsRule
Replacing RestartableJenkinsRule with JenkinsSessionRule
Replacing Guava, Apache Commons, and Joda Time with Java Platform equivalents
Use the "Contributing to Open Source" document and the "Modernizing Jenkins Plugins" video series to understand some of the transformations.
The scope of this project is to create a generic tool for applying these types of transformations against Jenkins plugins, validating the applied transformations, and creating pull requests with the results. While not all of the transformations described above will be implemented as part of this project, it is expected that a subset of the above list will be implemented to prove the viability of the newly-created tool.
Note that some of these transformations depend on other transformations, so a stack of transformations must be created and validated prior to creating the pull request.
The transformations range from editing Maven pom.xml files to applying automated refactorings to Java source code. It is suggested that XML and Java manipulation frameworks like JDOM and Refaster be used to implement the transformations described above.
New feature will be developed towards the end of the project.
Details to be clarified interactively, together with the mentors, during the Contributor Application drafting phase.