Custom War Packager Docker Image
Custom WAR Packager(CWP)是一个允许使用YAML规范构建即用型Jenkins包的工具,可生成Docker镜像、WAR文件和Jenkinsfile Runner Docker镜像,包含Jenkins核心、插件、额外库及通过Groovy Hook脚本或Configuration-as-Code插件的自配置。
Jenkins Custom WAR Packager
Custom WAR Packager (CWP) allows building ready-to-fly Jenkins packages using a YAML specification. The tool can produce Docker images, WAR files, and https://github.com/jenkinsci/jenkinsfile-runner docker images (aka single-shot Jenkins masters). These bundles may include Jenkins core, plugins, extra libraries, and self-configuration via https://wiki.jenkins.io/display/JENKINS/Groovy+Hook+Script or https://github.com/jenkinsci/configuration-as-code-plugin YAML files.
See https://jenkins.io/blog/2018/10/16/custom-war-packager/ for more information.
Demo
- Jenkins WAR - all latest - bundles master branches for core and some key libraries/modules
- Jenkins WAR - all latest with Maven - same as a above, but with Maven
- External Task Logging to Elasticsearch - runs External Logging demo and preconfigures it using System Groovy Hooks. The demo is packaged with Docker, and it provides a ready-to-fly Docker Compose package.
- Configuration as Code - configuring WAR with https://github.com/jenkinsci/configuration-as-code-plugin via YAML
- Core components build - demonstrates how to modify core components (libraries, modules)
- https://github.com/oleg-nenashev/jenkins-custom-war-packager-ci-demo - Standalone demo with an integrated CI flow
- Jenkinsfile Runner - Packaging of Docker image for Jenkinsfile Runner
Usage
The tool offers a CLI interface and a Maven Plugin wrapper.
CLI
shelljava -jar custom-war-packager-cli.jar -configPath=mywar.yml -version=1.0-SNAPSHOT -tmpDir=tmp
After the build the generated WAR file will be put to tmp/output/target/${artifactId}.war.
To run the tool in a demo mode with this config, use the following command:
shelljava -jar war-packager-cli.jar -demo
Invoke the tool without options to get a full CLI options list.
Maven
Maven plugin runs the packager and generates the artifact. The artifact will be put to "target/custom-war-packager-maven-plugin/output/target/${bundle.artifactId}.war" and added to the project artifacts.
xml<build> <plugins> <plugin> <groupId>io.jenkins.tools.custom-war-packager</groupId> <artifactId>custom-war-packager-maven-plugin</artifactId> <version>@project.version@</version> <executions> <execution> <phase>package</phase> <goals> <goal>custom-war</goal> </goals> <configuration> <configFilePath>spotcheck.yml</configFilePath> <warVersion>1.1-SNAPSHOT</warVersion> </configuration> </execution> </executions> </plugin> </plugins> </build>
Note that this plugin invokes Maven-in-Maven, and that it won't pass build options to the plugin. Configuration file can be used to configure the downstream builder.
Prerequisites
- Maven 3.5.0 or above
- Java 8
- Git (if any Git sources are defined)
Custom WAR Packager offers a Docker Image which bundles all the required tools.
Configuration file
Example:
yamlbundle: groupId: "io.github.oleg-nenashev" artifactId: "mywar" description: "Just a WAR auto-generation-sample" vendor: "Jenkins project" buildSettings: docker: base: "jenkins/jenkins:2.121.1" tag: "jenkins/demo-external-task-logging-elk" build: true war: groupId: "org.jenkins-ci.main" artifactId: "jenkins-war" source: version: 2.107 plugins: - groupId: "org.jenkins-ci.plugins" artifactId: "matrix-project" source: version: 1.9 - groupId: "org.jenkins-ci.plugins" artifactId: "durable-task" source: git: https://github.com/jglick/durable-task-plugin.git branch: watch-JENKINS-38381 - groupId: "org.jenkins-ci.plugins.workflow" artifactId: "workflow-durable-task-step" source: git: https://github.com/jglick/workflow-durable-task-step-plugin.git commit: 6c424e059bba90fc94a9c1e87dc9c4a324bfef26 - groupId: "io.jenkins" artifactId: "configuration-as-code" source: version: 0.11-alpha-rc373.933033f6b51e libPatches: - groupId: "org.jenkins-ci.main" artifactId: "remoting" source: git: https://github.com/jenkinsci/remoting.git systemProperties: { jenkins.model.Jenkins.slaveAgentPort: "50000", jenkins.model.Jenkins.slaveAgentPortEnforce: "true"} groovyHooks: - type: "init" id: "initScripts" source: dir: scripts casc: - id: "jcasc-config" source: dir: jenkins.yml
There are more options available. See the linked demos for examples.
BOM support
The plugin supports Bill of Materials (BOM), described in https://github.com/jenkinsci/jep/tree/master/jep/309, as an input.
If BOM is defined, Custom WAR Packager will load plugin and component dependencies from there. The example below takes the input from BOM and produces custom WAR and Docker packages.
yamlbundle: groupId: "io.jenkins.tools.war-packager.demo" artifactId: "bom-demo" buildSettings: bom: bom.yml environment: aws docker: base: "jenkins/jenkins:2.121.2" tag: "jenkins/cwp-bom-demo" build: true
An example of such configuration is available https://github.com/jenkinsci/artifact-manager-s3-plugin/pull/20.
Plugins from POM
In order to simplify packaging for development versions, it is possible to link Custom War Packager to the POM file so that it takes plugins to be bundled from there.
If the pom option is set, all dependencies will be added, including test ones.
The current parent will be also bundled unless the pomIgnoreRoot flag is set.
yamlbundle: groupId: "io.jenkins.tools.war-packager.demo" artifactId: "pom-input-demo" buildSettings: pom: pom.xml pomIgnoreRoot: true war: groupId: "org.jenkins-ci.main" artifactId: "jenkins-war" source: version: 2.121.1
Example is available here.
Advanced features
Features:
- Rebuilding Jenkins core with custom dependencies (e.g., Remoting or Stapler)
- Adding extra libraries to the Jenkins core so that they can be used in extensions
Limitations
Currently, the tool is in the alpha state. It has some serious limitations:
- All built artifacts with Git source are being installed to the local repository
- Versions are unique for every commit, so beware of local repo pollution
- System properties work only for a custom
jenkins.util.SystemPropertiesclass defined in the core- Use Groovy Hook Scripts if you need to set up other system properties
libPatchessteps bundles only a specified JAR file, but not its dependencies Dependencies need to be explicitly packaged as well if they change compared to the base WAR filelibExcludescan be used to remove dependencies which are not required anymore
镜像拉取方式
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。
轩辕镜像加速拉取命令点我查看更多 custom-war-packager 镜像标签
DockerHub 原生拉取命令
用户好评
来自真实用户的反馈,见证轩辕镜像的优质服务