You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2023/03/14 08:53:06 UTC

[camel] branch main updated (ae711ab5c6e -> cd6989ce1a9)

This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a change to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


    from ae711ab5c6e Regen for commit 4f35175ef6b31d6a64158a2e6c723553c799b25c
     new 290b145f53f CAMEL-19144: camel-catalog - Include information about existing Camel releases
     new cd6989ce1a9 CAMEL-19128: camel-jbang - version command to show release date/eol

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 catalog/camel-catalog/pom.xml                      |  26 +-
 .../camel/catalog/releases/camel-releases.json     | 651 +++++++++++++++++++++
 .../org/apache/camel/catalog/CamelCatalog.java     |   6 +
 .../apache/camel/catalog/DefaultCamelCatalog.java  |  22 +
 .../org/apache/camel/catalog/CamelCatalogTest.java |  14 +
 .../jbang/core/commands/version/VersionList.java   | 103 ++--
 .../org/apache/camel/tooling/model/JsonMapper.java |  26 +
 .../{ArtifactModel.java => ReleaseModel.java}      |  52 +-
 .../maven/packaging/UpdateCamelReleasesMojo.java   | 161 +++++
 9 files changed, 1003 insertions(+), 58 deletions(-)
 create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/releases/camel-releases.json
 copy tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/{ArtifactModel.java => ReleaseModel.java} (63%)
 create mode 100644 tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/UpdateCamelReleasesMojo.java


[camel] 02/02: CAMEL-19128: camel-jbang - version command to show release date/eol

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git

commit cd6989ce1a9b60581a04fd78c5d5d668230175cf
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Tue Mar 14 09:52:43 2023 +0100

    CAMEL-19128: camel-jbang - version command to show release date/eol
---
 .../jbang/core/commands/version/VersionList.java   | 103 +++++++++++++--------
 1 file changed, 66 insertions(+), 37 deletions(-)

diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/version/VersionList.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/version/VersionList.java
index 159bdd8c4a2..e36eed467ca 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/version/VersionList.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/version/VersionList.java
@@ -16,25 +16,33 @@
  */
 package org.apache.camel.dsl.jbang.core.commands.version;
 
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Date;
 import java.util.List;
+import java.util.Locale;
 import java.util.stream.Collectors;
 
 import com.github.freva.asciitable.AsciiTable;
 import com.github.freva.asciitable.Column;
 import com.github.freva.asciitable.HorizontalAlign;
+import org.apache.camel.catalog.CamelCatalog;
+import org.apache.camel.catalog.DefaultCamelCatalog;
 import org.apache.camel.dsl.jbang.core.commands.CamelCommand;
 import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
 import org.apache.camel.dsl.jbang.core.common.RuntimeCompletionCandidates;
 import org.apache.camel.dsl.jbang.core.common.VersionHelper;
 import org.apache.camel.main.KameletMain;
 import org.apache.camel.main.download.MavenDependencyDownloader;
+import org.apache.camel.tooling.model.ReleaseModel;
 import picocli.CommandLine;
 
 @CommandLine.Command(name = "list", description = "Displays available Camel versions")
 public class VersionList extends CamelCommand {
 
+    private static final String YYYY_MM_DD = "yyyy-MM-dd";
+
     @CommandLine.Option(names = { "--sort" },
                         description = "Sort by version", defaultValue = "version")
     String sort;
@@ -93,17 +101,34 @@ public class VersionList extends CamelCommand {
             return 1;
         }
 
+        CamelCatalog catalog = new DefaultCamelCatalog();
+        List<ReleaseModel> releases = catalog.camelReleases();
+
         List<Row> rows = new ArrayList<>();
         for (String[] v : versions) {
             Row row = new Row();
             rows.add(row);
             row.coreVersion = v[0];
             row.runtimeVersion = v[1];
+
+            // enrich with details from catalog (if we can find any)
+            ReleaseModel rm = releases.stream().filter(r -> v[0].equals(r.getVersion())).findFirst().orElse(null);
+            if (rm != null) {
+                row.releaseDate = rm.getDate();
+                row.eolDate = rm.getEol();
+                row.jdks = rm.getJdk();
+                row.kind = rm.getKind();
+            }
+        }
+
+        if (lts) {
+            rows.removeIf(r -> !"lts".equalsIgnoreCase(r.kind));
         }
 
         // sort rows
         rows.sort(this::sortRow);
 
+        // camel-quarkus is not LTS and have its own release schedule
         System.out.println(AsciiTable.getTable(AsciiTable.NO_BORDERS, rows, Arrays.asList(
                 new Column().header("CAMEL VERSION")
                         .headerAlign(HorizontalAlign.CENTER).dataAlign(HorizontalAlign.CENTER).with(r -> r.coreVersion),
@@ -113,8 +138,12 @@ public class VersionList extends CamelCommand {
                         .headerAlign(HorizontalAlign.CENTER).dataAlign(HorizontalAlign.CENTER).with(r -> r.runtimeVersion),
                 new Column().header("JDK")
                         .headerAlign(HorizontalAlign.CENTER).dataAlign(HorizontalAlign.RIGHT).with(this::jdkVersion),
-                new Column().header("SUPPORT")
-                        .headerAlign(HorizontalAlign.CENTER).dataAlign(HorizontalAlign.CENTER).with(this::lts))));
+                new Column().header("KIND").visible(!"quarkus".equalsIgnoreCase(runtime))
+                        .headerAlign(HorizontalAlign.CENTER).dataAlign(HorizontalAlign.CENTER).with(this::kind),
+                new Column().header("RELEASED").visible(!"quarkus".equalsIgnoreCase(runtime))
+                        .headerAlign(HorizontalAlign.CENTER).dataAlign(HorizontalAlign.RIGHT).with(this::releaseDate),
+                new Column().header("SUPPORTED UNTIL").visible(!"quarkus".equalsIgnoreCase(runtime))
+                        .headerAlign(HorizontalAlign.CENTER).dataAlign(HorizontalAlign.RIGHT).with(this::eolDate))));
 
         return 0;
     }
@@ -135,58 +164,58 @@ public class VersionList extends CamelCommand {
     }
 
     private String jdkVersion(Row r) {
-        if (VersionHelper.isGE(r.coreVersion, "4.0")) {
-            return "17";
-        } else if (VersionHelper.isGE(r.coreVersion, "3.15")) {
-            return "11, 17";
-        } else if (VersionHelper.isGE(r.coreVersion, "3.15")) {
-            return "11, 17";
-        } else if (VersionHelper.isGE(r.coreVersion, "3.0")) {
-            return "8, 11";
-        } else {
-            return "8";
+        return r.jdks;
+    }
+
+    private String kind(Row r) {
+        if (r.kind != null) {
+            return r.kind.toUpperCase(Locale.ROOT);
         }
+        return "";
     }
 
-    private String lts(Row r) {
-        return isLtsRelease(r.coreVersion) ? "LTS" : "";
+    private String releaseDate(Row r) {
+        try {
+            if (r.releaseDate != null) {
+                SimpleDateFormat sdf = new SimpleDateFormat(YYYY_MM_DD);
+                Date d = sdf.parse(r.releaseDate);
+                SimpleDateFormat sdf2 = new SimpleDateFormat("MMMM yyyy", Locale.US);
+                return sdf2.format(d);
+            }
+        } catch (Exception e) {
+            // ignore
+        }
+        return r.releaseDate != null ? r.releaseDate : "";
     }
 
-    private static boolean isLtsRelease(String version) {
-        if (VersionHelper.isBetween(version, "4.0.0", "4.1")) {
-            return true;
-        } else if (VersionHelper.isBetween(version, "3.20", "3.99")) {
-            return true;
-        } else if (VersionHelper.isBetween(version, "3.18", "3.19")) {
-            return true;
-        } else if (VersionHelper.isBetween(version, "3.14", "3.15")) {
-            return true;
-        } else if (VersionHelper.isBetween(version, "3.11", "3.12")) {
-            return true;
-        } else if (VersionHelper.isBetween(version, "3.11", "3.12")) {
-            return true;
-        } else if (VersionHelper.isBetween(version, "3.7", "3.8")) {
-            return true;
-        } else if (VersionHelper.isBetween(version, "3.4", "3.5")) {
-            return true;
+    private String eolDate(Row r) {
+        try {
+            if (r.eolDate != null) {
+                SimpleDateFormat sdf = new SimpleDateFormat(YYYY_MM_DD);
+                Date d = sdf.parse(r.eolDate);
+                SimpleDateFormat sdf2 = new SimpleDateFormat("MMMM yyyy", Locale.US);
+                return sdf2.format(d);
+            }
+        } catch (Exception e) {
+            // ignore
         }
-        return false;
+        return r.eolDate != null ? r.eolDate : "";
     }
 
     private boolean acceptVersion(String version) {
         if (version == null) {
             return false;
         }
-        boolean accept = VersionHelper.isGE(version, minimumVersion);
-        if (accept && lts) {
-            accept = isLtsRelease(version);
-        }
-        return accept;
+        return VersionHelper.isGE(version, minimumVersion);
     }
 
     private static class Row {
         String coreVersion;
         String runtimeVersion;
+        String releaseDate;
+        String eolDate;
+        String kind;
+        String jdks;
     }
 
 }


[camel] 01/02: CAMEL-19144: camel-catalog - Include information about existing Camel releases

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 290b145f53f4e8b1e4dc202641559319c9a253ee
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Tue Mar 14 09:31:10 2023 +0100

    CAMEL-19144: camel-catalog - Include information about existing Camel releases
---
 catalog/camel-catalog/pom.xml                      |  26 +-
 .../camel/catalog/releases/camel-releases.json     | 651 +++++++++++++++++++++
 .../org/apache/camel/catalog/CamelCatalog.java     |   6 +
 .../apache/camel/catalog/DefaultCamelCatalog.java  |  22 +
 .../org/apache/camel/catalog/CamelCatalogTest.java |  14 +
 .../org/apache/camel/tooling/model/JsonMapper.java |  26 +
 .../apache/camel/tooling/model/ReleaseModel.java   |  66 +++
 .../maven/packaging/UpdateCamelReleasesMojo.java   | 161 +++++
 8 files changed, 971 insertions(+), 1 deletion(-)

diff --git a/catalog/camel-catalog/pom.xml b/catalog/camel-catalog/pom.xml
index 91853a5a3ea..e89853ee068 100644
--- a/catalog/camel-catalog/pom.xml
+++ b/catalog/camel-catalog/pom.xml
@@ -17,7 +17,8 @@
     limitations under the License.
 
 -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
     <parent>
@@ -195,4 +196,27 @@
 
     </build>
 
+    <profiles>
+        <profile>
+            <id>update-camel-releases</id>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.camel</groupId>
+                        <artifactId>camel-package-maven-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <goals>
+                                    <!-- update camel release details from camel-website -->
+                                    <goal>update-camel-releases</goal>
+                                </goals>
+                                <phase>generate-resources</phase>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
+
 </project>
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/releases/camel-releases.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/releases/camel-releases.json
new file mode 100644
index 00000000000..c20f6b3623e
--- /dev/null
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/releases/camel-releases.json
@@ -0,0 +1,651 @@
+[
+    {
+        "version": "2.18.0",
+        "date": "2016-10-05",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.18.1",
+        "date": "2016-11-27",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.18.2",
+        "date": "2017-01-22",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.18.3",
+        "date": "2017-03-08",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.18.4",
+        "date": "2017-03-08",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.18.5",
+        "date": "2017-09-21",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.19.0",
+        "date": "2017-04-30",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.19.1",
+        "date": "2017-06-11",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.19.2",
+        "date": "2017-07-28",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.19.3",
+        "date": "2017-09-10",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.19.4",
+        "date": "2017-11-01",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.19.5",
+        "date": "2018-03-24",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.20.0",
+        "date": "2017-10-07",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.20.1",
+        "date": "2017-11-10",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.20.2",
+        "date": "2018-01-22",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.20.3",
+        "date": "2018-03-25",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.20.4",
+        "date": "2018-07-21",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.21.0",
+        "date": "2018-03-11",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.21.1",
+        "date": "2018-04-29",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.21.2",
+        "date": "2018-07-16",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.21.3",
+        "date": "2018-10-21",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.21.4",
+        "date": "2019-01-06",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.21.5",
+        "date": "2019-02-02",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.22.0",
+        "date": "2018-06-29",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.22.1",
+        "date": "2018-09-02",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.22.2",
+        "date": "2018-11-01",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.22.3",
+        "date": "2019-01-19",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.22.4",
+        "date": "2019-04-07",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.22.5",
+        "date": "2019-06-08",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.23.0",
+        "date": "2018-11-24",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.23.1",
+        "date": "2019-01-12",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.23.2",
+        "date": "2019-04-06",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.23.3",
+        "date": "2019-06-09",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.23.4",
+        "date": "2019-09-22",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.24.0",
+        "date": "2019-05-12",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.24.1",
+        "date": "2019-06-20",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.24.2",
+        "date": "2019-09-13",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.24.3",
+        "date": "2019-12-26",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.25.0",
+        "date": "2020-01-23",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.25.1",
+        "date": "2020-04-16",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.25.2",
+        "date": "2020-07-21",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.25.3",
+        "date": "2020-12-24",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "2.25.4",
+        "date": "2021-05-28",
+        "eol": "2022-01-01",
+        "kind": "legacy",
+        "jdk": "8"
+    },
+    {
+        "version": "3.0.0",
+        "date": "2019-11-28",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.0.0-RC1",
+        "date": "2019-09-01",
+        "kind": "RC",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.0.0-RC2",
+        "date": "2019-10-06",
+        "kind": "RC",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.0.0-RC3",
+        "date": "2019-10-25",
+        "kind": "RC",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.0.1",
+        "date": "2020-01-16",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.1.0",
+        "date": "2020-02-27",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.10.0",
+        "date": "2021-05-20",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.11.0",
+        "date": "2021-06-28",
+        "eol": "2022-07-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.11.1",
+        "date": "2021-08-05",
+        "eol": "2022-07-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.11.2",
+        "date": "2021-09-13",
+        "eol": "2022-07-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.11.3",
+        "date": "2021-10-12",
+        "eol": "2022-07-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.11.4",
+        "date": "2021-11-24",
+        "eol": "2022-07-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.11.5",
+        "date": "2021-12-31",
+        "eol": "2022-07-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.11.6",
+        "date": "2022-03-13",
+        "eol": "2022-07-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.11.7",
+        "date": "2022-05-05",
+        "eol": "2022-07-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.12.0",
+        "date": "2021-10-04",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.13.0",
+        "date": "2021-11-12",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.14.0",
+        "date": "2021-12-16",
+        "eol": "2023-12-16",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.14.1",
+        "date": "2022-01-27",
+        "eol": "2023-12-16",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.14.2",
+        "date": "2022-03-08",
+        "eol": "2023-12-16",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.14.3",
+        "date": "2022-05-06",
+        "eol": "2023-12-16",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.14.4",
+        "date": "2022-06-30",
+        "eol": "2023-12-16",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.14.5",
+        "date": "2022-08-20",
+        "eol": "2023-12-16",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.14.6",
+        "date": "2022-11-05",
+        "eol": "2023-12-16",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.14.7",
+        "date": "2022-12-17",
+        "eol": "2023-12-16",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.15.0",
+        "date": "2022-02-04",
+        "jdk": "11"
+    },
+    {
+        "version": "3.16.0",
+        "date": "2022-03-28",
+        "jdk": "11"
+    },
+    {
+        "version": "3.17.0",
+        "date": "2022-05-19",
+        "jdk": "11,17"
+    },
+    {
+        "version": "3.18.0",
+        "date": "2022-07-06",
+        "eol": "2023-07-06",
+        "kind": "lts",
+        "jdk": "11,17"
+    },
+    {
+        "version": "3.18.1",
+        "date": "2022-08-11",
+        "eol": "2023-07-06",
+        "kind": "lts",
+        "jdk": "11,17"
+    },
+    {
+        "version": "3.18.2",
+        "date": "2022-09-08",
+        "eol": "2023-07-06",
+        "kind": "lts",
+        "jdk": "11,17"
+    },
+    {
+        "version": "3.18.3",
+        "date": "2022-10-31",
+        "eol": "2023-07-06",
+        "kind": "lts",
+        "jdk": "11,17"
+    },
+    {
+        "version": "3.18.4",
+        "date": "2022-12-01",
+        "eol": "2023-07-06",
+        "kind": "lts",
+        "jdk": "11,17"
+    },
+    {
+        "version": "3.18.5",
+        "date": "2023-01-25",
+        "eol": "2023-07-06",
+        "kind": "lts",
+        "jdk": "11,17"
+    },
+    {
+        "version": "3.19.0",
+        "date": "2022-10-03",
+        "jdk": "11,17"
+    },
+    {
+        "version": "3.2.0",
+        "date": "2020-04-06",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.20.0",
+        "date": "2022-12-21",
+        "eol": "2023-12-21",
+        "kind": "lts",
+        "jdk": "11,17"
+    },
+    {
+        "version": "3.20.1",
+        "date": "2023-01-07",
+        "eol": "2023-12-21",
+        "kind": "lts",
+        "jdk": "11,17"
+    },
+    {
+        "version": "3.20.2",
+        "date": "2023-02-07",
+        "eol": "2023-12-21",
+        "kind": "lts",
+        "jdk": "11,17"
+    },
+    {
+        "version": "3.3.0",
+        "date": "2020-05-15",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.4.0",
+        "date": "2020-06-18",
+        "eol": "2021-06-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.4.1",
+        "date": "2020-07-12",
+        "eol": "2021-06-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.4.2",
+        "date": "2020-07-19",
+        "eol": "2021-06-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.4.3",
+        "date": "2020-08-15",
+        "eol": "2021-06-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.4.4",
+        "date": "2020-09-28",
+        "eol": "2021-06-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.4.5",
+        "date": "2020-12-23",
+        "eol": "2021-06-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.4.6",
+        "date": "2021-06-21",
+        "eol": "2021-06-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.5.0",
+        "date": "2020-09-04",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.6.0",
+        "date": "2020-09-20",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.7.0",
+        "date": "2020-12-16",
+        "eol": "2022-01-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.7.1",
+        "date": "2021-01-21",
+        "eol": "2022-01-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.7.2",
+        "date": "2021-02-08",
+        "eol": "2022-01-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.7.3",
+        "date": "2021-03-10",
+        "eol": "2022-01-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.7.4",
+        "date": "2021-05-03",
+        "eol": "2022-01-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.7.5",
+        "date": "2021-07-12",
+        "eol": "2022-01-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.7.6",
+        "date": "2021-10-05",
+        "eol": "2022-01-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.7.7",
+        "date": "2021-12-23",
+        "eol": "2022-01-01",
+        "kind": "lts",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.8.0",
+        "date": "2021-02-13",
+        "jdk": "8,11"
+    },
+    {
+        "version": "3.9.0",
+        "date": "2021-03-28",
+        "jdk": "8,11"
+    },
+    {
+        "version": "4.0.0-M1",
+        "date": "2023-02-04",
+        "kind": "RC",
+        "jdk": "17"
+    },
+    {
+        "version": "4.0.0-M2",
+        "date": "2023-03-10",
+        "kind": "RC",
+        "jdk": "17"
+    }
+]
diff --git a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/CamelCatalog.java b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/CamelCatalog.java
index f58db2325e2..28b37fea1f3 100644
--- a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/CamelCatalog.java
+++ b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/CamelCatalog.java
@@ -30,6 +30,7 @@ import org.apache.camel.tooling.model.EipModel;
 import org.apache.camel.tooling.model.LanguageModel;
 import org.apache.camel.tooling.model.MainModel;
 import org.apache.camel.tooling.model.OtherModel;
+import org.apache.camel.tooling.model.ReleaseModel;
 
 /**
  * Catalog of components, data formats, models (EIPs), languages, and more from this Apache Camel release.
@@ -573,4 +574,9 @@ public interface CamelCatalog {
      */
     InputStream loadResource(String kind, String name);
 
+    /**
+     * Load all Camel releases from catalog
+     */
+    List<ReleaseModel> camelReleases();
+
 }
diff --git a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java
index ebcd1095cb9..3199bfa766b 100644
--- a/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java
+++ b/catalog/camel-catalog/src/main/java/org/apache/camel/catalog/DefaultCamelCatalog.java
@@ -44,7 +44,10 @@ import org.apache.camel.tooling.model.JsonMapper;
 import org.apache.camel.tooling.model.LanguageModel;
 import org.apache.camel.tooling.model.MainModel;
 import org.apache.camel.tooling.model.OtherModel;
+import org.apache.camel.tooling.model.ReleaseModel;
+import org.apache.camel.util.json.JsonArray;
 import org.apache.camel.util.json.JsonObject;
+import org.apache.camel.util.json.Jsoner;
 
 /**
  * Default {@link CamelCatalog}.
@@ -487,6 +490,25 @@ public class DefaultCamelCatalog extends AbstractCamelCatalog implements CamelCa
         return versionManager.getResourceAsStream(BASE_RESOURCE_DIR + "/" + kind + "/" + name);
     }
 
+    @Override
+    public List<ReleaseModel> camelReleases() {
+        return cache("camelReleases", () -> {
+            try {
+                List<ReleaseModel> answer = new ArrayList<>();
+                InputStream is = loadResource("releases", "camel-releases.json");
+                String json = CatalogHelper.loadText(is);
+                JsonArray arr = (JsonArray) Jsoner.deserialize(json);
+                for (Object o : arr) {
+                    JsonObject jo = (JsonObject) o;
+                    answer.add(JsonMapper.generateReleaseModel(jo));
+                }
+                return answer;
+            } catch (Exception e) {
+                return Collections.emptyList();
+            }
+        });
+    }
+
     private static boolean matchArtifact(ArtifactModel<?> am, String groupId, String artifactId, String version) {
         if (am == null) {
             return false;
diff --git a/catalog/camel-catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java b/catalog/camel-catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java
index fd19a78ea26..f95074458a6 100644
--- a/catalog/camel-catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java
+++ b/catalog/camel-catalog/src/test/java/org/apache/camel/catalog/CamelCatalogTest.java
@@ -31,6 +31,7 @@ import org.apache.camel.tooling.model.ArtifactModel;
 import org.apache.camel.tooling.model.ComponentModel;
 import org.apache.camel.tooling.model.DataFormatModel;
 import org.apache.camel.tooling.model.LanguageModel;
+import org.apache.camel.tooling.model.ReleaseModel;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
@@ -1537,4 +1538,17 @@ public class CamelCatalogTest {
         Assertions.assertNull(is);
     }
 
+    @Test
+    public void camelReleases() {
+        List<ReleaseModel> list = catalog.camelReleases();
+        Assertions.assertTrue(list.size() > 100);
+
+        ReleaseModel rel = list.stream().filter(r -> r.getVersion().equals("3.20.1")).findFirst().orElse(null);
+        Assertions.assertNotNull(rel);
+        Assertions.assertEquals("3.20.1", rel.getVersion());
+        Assertions.assertEquals("2023-01-07", rel.getDate());
+        Assertions.assertEquals("2023-12-21", rel.getEol());
+        Assertions.assertEquals("lts", rel.getKind());
+    }
+
 }
diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JsonMapper.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JsonMapper.java
index 0b3db6dbc5e..c52d6775062 100644
--- a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JsonMapper.java
+++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/JsonMapper.java
@@ -606,6 +606,32 @@ public final class JsonMapper {
         return json;
     }
 
+    public static JsonObject asJsonObject(ReleaseModel model) {
+        JsonObject json = new JsonObject();
+        json.put("version", model.getVersion());
+        json.put("date", model.getDate());
+        if (model.getEol() != null) {
+            json.put("eol", model.getEol());
+        }
+        if (model.getKind() != null) {
+            json.put("kind", model.getKind());
+        }
+        if (model.getJdk() != null) {
+            json.put("jdk", model.getJdk());
+        }
+        return json;
+    }
+
+    public static ReleaseModel generateReleaseModel(JsonObject obj) {
+        ReleaseModel model = new ReleaseModel();
+        model.setVersion(obj.getString("version"));
+        model.setDate(obj.getString("date"));
+        model.setEol(obj.getString("eol"));
+        model.setKind(obj.getString("kind"));
+        model.setJdk(obj.getString("jdk"));
+        return model;
+    }
+
     public static String createJsonSchema(MainModel model) {
         JsonObject wrapper = asJsonObject(model);
         return serialize(wrapper);
diff --git a/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/ReleaseModel.java b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/ReleaseModel.java
new file mode 100644
index 00000000000..4b48d03beb1
--- /dev/null
+++ b/tooling/camel-tooling-model/src/main/java/org/apache/camel/tooling/model/ReleaseModel.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.tooling.model;
+
+public class ReleaseModel {
+
+    protected String version;
+    protected String date;
+    protected String eol;
+    protected String kind;
+    protected String jdk;
+
+    public String getVersion() {
+        return version;
+    }
+
+    public void setVersion(String version) {
+        this.version = version;
+    }
+
+    public String getDate() {
+        return date;
+    }
+
+    public void setDate(String date) {
+        this.date = date;
+    }
+
+    public String getEol() {
+        return eol;
+    }
+
+    public void setEol(String eol) {
+        this.eol = eol;
+    }
+
+    public String getKind() {
+        return kind;
+    }
+
+    public void setKind(String kind) {
+        this.kind = kind;
+    }
+
+    public String getJdk() {
+        return jdk;
+    }
+
+    public void setJdk(String jdk) {
+        this.jdk = jdk;
+    }
+}
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/UpdateCamelReleasesMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/UpdateCamelReleasesMojo.java
new file mode 100644
index 00000000000..2de3f549f07
--- /dev/null
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/UpdateCamelReleasesMojo.java
@@ -0,0 +1,161 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.maven.packaging;
+
+import java.io.File;
+import java.io.LineNumberReader;
+import java.io.StringReader;
+import java.net.URI;
+import java.net.http.HttpClient;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+import java.nio.file.Path;
+import java.time.Duration;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+
+import org.apache.camel.tooling.model.JsonMapper;
+import org.apache.camel.tooling.model.ReleaseModel;
+import org.apache.camel.util.json.JsonArray;
+import org.apache.camel.util.json.JsonObject;
+import org.apache.camel.util.json.Jsoner;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.MojoFailureException;
+import org.apache.maven.plugins.annotations.LifecyclePhase;
+import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
+
+/**
+ * Unfortunately we do not have a release timestamp for every Camel release published to maven. So we need to grab the
+ * dates from camel-website git repository.
+ */
+@Mojo(name = "update-camel-releases", threadSafe = true, defaultPhase = LifecyclePhase.PROCESS_CLASSES)
+public class UpdateCamelReleasesMojo extends AbstractGeneratorMojo {
+
+    private static final String GIT_URL = "https://api.github.com/repos/apache/camel-website/contents/content/releases/";
+
+    /**
+     * The output directory for generated file
+     */
+    @Parameter(defaultValue = "${project.basedir}/src/generated/resources/org/apache/camel/catalog/releases")
+    protected File outDir;
+
+    @Override
+    public void execute() throws MojoExecutionException, MojoFailureException {
+        if (outDir == null) {
+            outDir = new File(project.getBasedir(), "src/generated/resources");
+        }
+
+        try {
+            getLog().info("Updating Camel release information from camel-website");
+            List<String> links = fetchCamelReleaseLinks();
+            List<ReleaseModel> releases = processReleases(links);
+            releases.sort(Comparator.comparing(ReleaseModel::getVersion));
+            getLog().info("Found " + releases.size() + " Camel releases");
+
+            JsonArray arr = new JsonArray();
+            for (ReleaseModel r : releases) {
+                JsonObject jo = JsonMapper.asJsonObject(r);
+                arr.add(jo);
+            }
+            String json = Jsoner.serialize(arr);
+            json = Jsoner.prettyPrint(json, 4);
+
+            Path path = outDir.toPath();
+            updateResource(path, "camel-releases.json", json);
+            addResourceDirectory(path);
+
+        } catch (Exception e) {
+            throw new MojoExecutionException(e);
+        }
+    }
+
+    private List<ReleaseModel> processReleases(List<String> urls) throws Exception {
+        List<ReleaseModel> answer = new ArrayList<>();
+
+        HttpClient hc = HttpClient.newHttpClient();
+        for (String url : urls) {
+            HttpResponse<String> res = hc.send(HttpRequest.newBuilder(new URI(url)).timeout(Duration.ofSeconds(20)).build(),
+                    HttpResponse.BodyHandlers.ofString());
+
+            if (res.statusCode() == 200) {
+                ReleaseModel model = new ReleaseModel();
+                LineNumberReader lr = new LineNumberReader(new StringReader(res.body()));
+                String line = lr.readLine();
+                while (line != null) {
+                    if (line.startsWith("date:")) {
+                        model.setDate(line.substring(5).trim());
+                    } else if (line.startsWith("version:")) {
+                        model.setVersion(line.substring(8).trim());
+                    } else if (line.startsWith("eol:")) {
+                        model.setEol(line.substring(4).trim());
+                    } else if (line.startsWith("kind:")) {
+                        model.setKind(line.substring(5).trim());
+                    } else if (line.startsWith("jdk:")) {
+                        String s = line.substring(4).trim();
+                        if (s.startsWith("[") && s.endsWith("]")) {
+                            s = s.substring(1, s.length() - 1);
+                        }
+                        model.setJdk(s);
+                    }
+                    line = lr.readLine();
+                }
+                if (model.getVersion() != null) {
+                    answer.add(model);
+                }
+            }
+        }
+
+        return answer;
+    }
+
+    private List<String> fetchCamelReleaseLinks() throws Exception {
+        List<String> answer = new ArrayList<>();
+
+        // use JDK http client to call github api
+        HttpClient hc = HttpClient.newHttpClient();
+        HttpResponse<String> res = hc.send(HttpRequest.newBuilder(new URI(GIT_URL)).timeout(Duration.ofSeconds(20)).build(),
+                HttpResponse.BodyHandlers.ofString());
+
+        // follow redirect
+        if (res.statusCode() == 302) {
+            String loc = res.headers().firstValue("location").orElse(null);
+            if (loc != null) {
+                res = hc.send(HttpRequest.newBuilder(new URI(loc)).timeout(Duration.ofSeconds(20)).build(),
+                        HttpResponse.BodyHandlers.ofString());
+            }
+        }
+
+        if (res.statusCode() == 200) {
+            JsonArray root = (JsonArray) Jsoner.deserialize(res.body());
+            for (Object o : root) {
+                JsonObject jo = (JsonObject) o;
+                String name = jo.getString("name");
+                if (name != null && name.startsWith("release-")) {
+                    String url = jo.getString("download_url");
+                    if (url != null) {
+                        answer.add(url);
+                    }
+                }
+            }
+        }
+
+        return answer;
+    }
+
+}