The other day, I have spent a week on crafting a reusable JUnit rule to complement JenkinsConfiguredWithCodeRule[2] that create Jenkins SUTs as independent local processes. The use case here is starting Jenkins with realistic classloading environment, testing realistic start/stop/restart scenarios (otherwise affected by JUT) or setting up multiple Jenkinses for test. I am distributing this to see if folks are interested in having something like this available so we can extract it from the plugin this was initially developed for.

---

The simplest way to consume it is:

```
public @Rule TemporaryFolder tmp = new TemporaryFolder();
public @Rule ExternalJenkinsRule ejr = new ExternalJenkinsRule(tmp);

@Test
@ExternalFixture(name = "my-jenkins", resource = "my-jenkins.yaml", injectPlugins = "matrix-auth")
public void myJenkins() throws Exception {
    ExternalJenkinsRule.Fixture myJenkins = ejr.fixture("my-jenkins");
com.offbytwo.jenkins.JenkinsServer jenkinsServer = myJenkins.getClient();
    ...
}
```

- The Jenkinses are launched in parallel in case there are multiple of them.
- Injected plugins are inject with their dependencies resolved by maven-hpi-plugin:resolve-test-dependencies (IOW, they have to be declared as maven dependencies but their injections is safe and fast). - Primary means of controlling such Jenkins is through jenkinsci/java-client-api.
- Dedicated temporary folder is allocated for every Jenkins.
- Jenkins log can be accessed for investigation.

For advanced usage one can subclass the ExternalJenkinsRule (as demonstrated by [1]) in order to:

- Rearrange or modify the declared fixture annotations per test (DRY).
- Alter plugins to inject (DRY).
- Specify particular environment variables, JVM or Jenkins arguments.
- All of the above can be tailored based on declared fixture role. Meaning the customizations deployed to individual fixtures do not have to be the same - common for heterogeneous grids.

There are certainly many areas to improve this, though for now my question is: Does it sound useful to you?

[1] https://github.com/jenkinsci/node-sharing-plugin/pull/106
[2] https://github.com/jenkinsci/configuration-as-code-plugin/blob/master/plugin/src/test/java/io/jenkins/plugins/casc/misc/JenkinsConfiguredWithCodeRule.java

Cheers
--
oliver

--
You received this message because you are subscribed to the Google Groups "Jenkins 
Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to jenkinsci-dev+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/jenkinsci-dev/1be57933-62d2-7588-3e9e-83a4c7269b5d%40gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to