From 005eca20ccaf2d5f31a0e1da3d5d21c23d33026b Mon Sep 17 00:00:00 2001 From: Jean-Francois Denise Date: Wed, 17 Jan 2024 11:24:01 +0100 Subject: [PATCH 1/2] What's new in provisioning for WildFly 31 --- .../2024-01-31-whats-new-in-provisioning.adoc | 97 +++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 _posts/2024-01-31-whats-new-in-provisioning.adoc diff --git a/_posts/2024-01-31-whats-new-in-provisioning.adoc b/_posts/2024-01-31-whats-new-in-provisioning.adoc new file mode 100644 index 00000000..f36d0e1c --- /dev/null +++ b/_posts/2024-01-31-whats-new-in-provisioning.adoc @@ -0,0 +1,97 @@ +--- +layout: post +title: "What's new in WildFly provisioning" +date: 2024-01-31 +tags: galleon provisioning wildfly-glow wildfly-maven-plugin +author: jdenise +description: What's new in WildFly provisioning. +--- + +This blog post provides information on recent evolutions that have occurred at the WildFly provisioning level. + +== WildFly Glow tooling + +This new approach to WildFly provisioning has been covered in details in this https://www.wildfly.org/news/2024/01/29/wildfly-glow/[blog post] and in +this https://www.youtube.com/watch?v=kt8pTDmTitw[video] published on the https://www.youtube.com/@WildFlyAS[WildFly Youtube Channel]. + +We are expecting more content to be published on this topic; stay tuned! + +== WildFly Bootable JAR support in the WildFly Maven Plugin + +From version 5.0.0.Beta2, the https://github.com/wildfly/wildfly-maven-plugin[WildFly Maven Plugin] allows you to provision a WildFly server as a Wildfly Bootable JAR. +The `package` goal configuration has been evolved with the following options: + +* `true|false`: to enable generation of a Bootable JAR. +* `name of the jar`: to set a specific JAR name. By default it is named `server-bootable.jar` + +In addition, a new goal `start-jar` has been introduced to start the generated JAR. The `shutdown` goal can be used to shutdown a bootable JAR. + +The https://github.com/wildfly-extras/wildfly-jar-maven-plugin[WildFly JAR Maven plugin] will stay, +but the WildFly Maven Plugin becomes the preferred way to build a WildFly Bootable JAR and provision a WildFly server for the cloud. + +=== WildFly Bootable JAR and cloud execution limitations + +When using the WildFly JAR Maven Plugin, you have the ability to set the `` option. +This option has not been migrated to the WildFly Maven Plugin. The reasons are: + +* Part of the content (the set of bash scripts that are run at server startup) packaged +in the `org.wildfly.cloud:wildfly-cloud-galleon-pack` that is used for the cloud context is not usable when the server is packaged as a Bootable JAR. + +* In a cloud context, the kind of packaging is not really relevant. WildFly servers are not directly started. +Containers are started whatever the kind of installed WildFly server. + +So the JAR produced by the WildFly Maven Plugin is not expected to be used in a cloud context. + +For cloud we advise provisioning a WildFly server. To do so: + +* Use http://docs.wildfly.org/wildfly-glow/[WildFly Glow] support (`cloud`) that will automatically retrieve the required Galleon feature-packs or +* If not using WildFly Glow, add the `org.wildfly.cloud:wildfly-cloud-galleon-pack` feature-pack to the `feature-packs` list. + +== Galleon Upward compatibility + +WildFly provisioning tooling heavily relies on https://docs.wildfly.org/galleon/[Galleon] technology. + +Galleon uses the WildFly feature-packs to provision a WildFly server. + +One issue that we have been facing in the past is that, when the structural content of a feature-pack changes +(due to an evolution of Galleon core library or new XML schema), the provisioning tooling must be upgraded to be able to handle the new format. +The failure occurs during provisioning, printing an hard to understand error message. + +The root cause of this problem is that a WildFly feature-pack can require a specific version of the Galleon core library to be properly provisioned, +and this version can differ from the version that the provisioning tooling (https://docs.wildfly.org/galleon/[Galleon CLI or Maven Plugin], https://github.com/wildfly/wildfly-maven-plugin[WildFly Maven Plugin], https://github.com/wildfly-extras/wildfly-jar-maven-plugin[WildFly Bootable JAR Maven Plugin], https://github.com/wildfly/wildfly-glow[WildFly Glow]) +directly depends on. + +To solve this problem we have evolved Galleon. + +=== WildFly Galleon feature-pack build time + +When using https://docs.wildfly.org/galleon-plugins/[WildFly Galleon Maven Plugin] 7.0.0.Beta1, the Galleon version used to build the feature-pack is included in the feature-pack. +A check is done at build time to validate that the content of the feature-pack is valid with respect to the Galleon version in use. +If some content is not supported, the build fails, and an upgrade of the WildFly Galleon Maven Plugin is required. + +=== WildFly provisioning time + +We have been introducing a new https://github.com/wildfly/galleon/tree/main/api[Galleon tooling API] that isolates the provisioning tooling +from the Galleon Core version. The API implementation detects the core version required by the feature-packs and uses it. + +So we should now be protected at provisioning time from incompatible changes. +This API is backward compatible with older WildFly feature-packs. + +The following provisioning tools have been ported to the new API: + +* https://docs.wildfly.org/galleon/[Galleon CLI and Maven Plugin] 6.0.0.Beta1 +* https://github.com/wildfly/wildfly-maven-plugin[WildFly Maven Plugin] 5.0.0.Beta2 +* https://github.com/wildfly-extras/wildfly-jar-maven-plugin[WildFly Bootable JAR Maven Plugin] 11.0.0.Beta1 +* https://github.com/wildfly/wildfly-glow[WildFly Glow] 1.0.0.Beta7 + +In addition, the Galleon CLI now checks for the latest version of Galleon at startup and advises you if a new version is available. + +This Galleon evolution is currently present in Galleon 6.0.0.Beta1. + +WildFly 31 has not yet switched to use it, but upgrading your provisioning tooling today would prepare you for the next major WildFly release. + +We plan to have Final releases prior to the WildFly 32 release. + +Thank-you! + +Jean-Francois Denise \ No newline at end of file From b0410ef8bd3e58c6c01c9bc87ba7a96908134e5e Mon Sep 17 00:00:00 2001 From: Brian Stansberry Date: Wed, 31 Jan 2024 18:03:27 -0600 Subject: [PATCH 2/2] Fix the author id; add an avatar picture of Jean-Francois --- .../2024-01-31-whats-new-in-provisioning.adoc | 4 ++-- assets/img/authors/jfdenise.jpg | Bin 0 -> 19713 bytes 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 assets/img/authors/jfdenise.jpg diff --git a/_posts/2024-01-31-whats-new-in-provisioning.adoc b/_posts/2024-01-31-whats-new-in-provisioning.adoc index f36d0e1c..0cde83ef 100644 --- a/_posts/2024-01-31-whats-new-in-provisioning.adoc +++ b/_posts/2024-01-31-whats-new-in-provisioning.adoc @@ -3,7 +3,7 @@ layout: post title: "What's new in WildFly provisioning" date: 2024-01-31 tags: galleon provisioning wildfly-glow wildfly-maven-plugin -author: jdenise +author: jfdenise description: What's new in WildFly provisioning. --- @@ -94,4 +94,4 @@ We plan to have Final releases prior to the WildFly 32 release. Thank-you! -Jean-Francois Denise \ No newline at end of file +Jean-Francois Denise diff --git a/assets/img/authors/jfdenise.jpg b/assets/img/authors/jfdenise.jpg new file mode 100644 index 0000000000000000000000000000000000000000..09e5aa0772588d1226f972742e02c90131a86ba5 GIT binary patch literal 19713 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