Compare commits

...

15 commits

Author SHA1 Message Date
6723df912e
Resolve FIXME but without fixing the issue
All checks were successful
Build / build (push) Successful in 19s
I tried to make this work but it might need a more thorough rewrite that I just cannot do.

The worst that can happen is stopping and starting Helma apps adding redundant ServletContextHandlers to the ContextHandlerCollection until Helma is restarted.
2025-04-07 17:16:59 +02:00
436862e87a
Remove setting of “empty” base resource
Fingers crossed it won’t be missed
2025-04-07 17:16:58 +02:00
36a12effb2
Bump Jetty versions to 12.0.19 2025-04-07 17:16:57 +02:00
2994a4becc
Disable Jetty’s session cookies
This remediates the exception “Shared scheduler not started” and restores the functionality of enabling an app in apps.properties – see #103 (comment)
2025-04-07 17:16:53 +02:00
99e8b204fd
Bump Java version 2025-04-07 17:05:43 +02:00
c42c0a7a17
Update repo URL 2025-04-07 17:05:43 +02:00
b7543cf615
Bump year of copyright notice 2025-04-07 17:05:42 +02:00
fc084f6e52
Escape HTML elements in commit messages 2025-04-07 17:05:41 +02:00
6fc73d2320
Add release notes generated with git-cliff 2025-04-07 17:05:40 +02:00
9b5cc988dd
Run the build workflow when itself has changed 2025-04-07 17:05:40 +02:00
04b210b464
Leave aside compiling for different Java versions for now 2025-04-07 17:05:39 +02:00
4c011f1e1b
Gradle is installed on the runner 2025-04-07 17:05:38 +02:00
bc7894ecc1
Use fully qualified URL for setup-java action 2025-04-07 17:05:38 +02:00
a3fbf72f38
Initial commit 2025-04-07 17:05:37 +02:00
de2150693f
Add deploy script usable with rsync and a restricted SSH key 2025-04-07 17:05:36 +02:00
10 changed files with 166 additions and 22 deletions

22
.github/workflows/build.yml vendored Normal file
View file

@ -0,0 +1,22 @@
name: Build
on:
push:
paths:
- .github/workflows/build.yml
- build.gradle
- settings.gradle
- src/**
- launcher/build.gradle
- launcher/src/**
workflow_dispatch:
jobs:
build:
runs-on: antville
steps:
- uses: actions/checkout@v4
- name: Compile with Gradle
run: ./gradlew :compileJava

View file

@ -9,16 +9,27 @@ permissions:
contents: write contents: write
jobs: jobs:
build: release:
runs-on: antville runs-on: antville
env: env:
GH_TOKEN: ${{ secrets.GH_TOKEN }} GH_TOKEN: ${{ secrets.GH_TOKEN }}
LC_TIME: en_US.UTF-8 LC_TIME: en_US.UTF-8
TODAY: $(date +'%d %b %Y')
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Create release notes
id: create_release_notes
run: |
release_notes=$(npx git-cliff@latest --latest)
# Write the release notes as a heredoc to the workflow output
# ⚠️ No white space around `<<` is crucial!
echo "release_notes<<.eot0x03" >> $GITHUB_OUTPUT
echo "$release_notes" >> $GITHUB_OUTPUT
echo ".eot0x03" >> $GITHUB_OUTPUT
- name: Build with Gradle - name: Build with Gradle
run: ./gradlew assembleDist run: ./gradlew assembleDist
@ -29,17 +40,17 @@ jobs:
direction: upload direction: upload
url: https://code.host.antville.org url: https://code.host.antville.org
token: ${{ github.token }} token: ${{ github.token }}
title: ${{ env.TODAY }} title: Helma ${{ github.ref_name }}
release-dir: build/distributions release-dir: build/distributions
release-notes-assistant: true release-notes: ${{ steps.create_release_notes.outputs.release_notes }}
verbose: true verbose: true
- name: Create release at GitHub - name: Create release at GitHub
run: | run: |
gh release create "$GITHUB_REF_NAME" \ gh release create "$GITHUB_REF_NAME" \
--repo "$GITHUB_REPOSITORY" \ --repo "$GITHUB_REPOSITORY" \
--title "${{ env.TODAY }}" \ --title "Helma ${{ github.ref_name }}" \
--generate-notes --notes "${{ steps.create_release_notes.outputs.release_notes }}"
- name: Upload release assets to GitHub - name: Upload release assets to GitHub
run: | run: |

View file

@ -1 +1 @@
11.0 17

View file

@ -1,6 +1,6 @@
# License # License
Copyright (c) 1999-2008 Helma Project. All rights reserved. Copyright (c) 1999-2025 Helma Project. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions modification, are permitted provided that the following conditions

View file

@ -2,8 +2,8 @@
## TL;DR ## TL;DR
- Make sure you have Java 11 or higher installed - Make sure you have Java 17 or higher installed
- Download and unpack the [latest release](https://github.com/antville/helma/releases) - Download and unpack the [latest release](https://code.host.antville.org/antville/helma/releases)
- Invoke `./bin/helma`, resp. `./bin/helma.bat`, depending on your platform - Invoke `./bin/helma`, resp. `./bin/helma.bat`, depending on your platform
- Direct your web browser to <http://localhost:8080> - Direct your web browser to <http://localhost:8080>

View file

@ -67,8 +67,8 @@ dependencies {
implementation 'com.sun.mail:javax.mail:1.6.2' implementation 'com.sun.mail:javax.mail:1.6.2'
implementation 'jakarta.servlet:jakarta.servlet-api:5.0.0' implementation 'jakarta.servlet:jakarta.servlet-api:5.0.0'
implementation 'org.ccil.cowan.tagsoup:tagsoup:1.2.1' implementation 'org.ccil.cowan.tagsoup:tagsoup:1.2.1'
implementation 'org.eclipse.jetty.ee9:jetty-ee9-servlet:12.0.9' implementation 'org.eclipse.jetty.ee9:jetty-ee9-servlet:12.0.19'
implementation 'org.eclipse.jetty:jetty-xml:12.0.9' implementation 'org.eclipse.jetty:jetty-xml:12.0.19'
implementation 'org.mozilla:rhino-all:1.8.0' implementation 'org.mozilla:rhino-all:1.8.0'
implementation 'org.sejda.imageio:webp-imageio:0.1.6' implementation 'org.sejda.imageio:webp-imageio:0.1.6'
implementation 'xerces:xercesImpl:2.12.2' implementation 'xerces:xercesImpl:2.12.2'

52
cliff.toml Normal file
View file

@ -0,0 +1,52 @@
# git-cliff ~ default configuration file
# https://git-cliff.org/docs/configuration
#
# Lines starting with "#" are comments.
# Configuration options are organized into tables and keys.
# See documentation for more information on available options.
[changelog]
trim = true
header = "## Changes"
body = """
{% for group, commits in commits | filter(attribute="merge_commit") | group_by(attribute="group") %}
### {{ group | striptags | trim | upper_first }}
{% for commit in commits %}
* [<tt>{{ commit.id | split(pat="") | slice(end=11) | join() }}</tt>]\
(https://code.host.antville.org/antville/helma/commit/{{ commit.id }}) \
{% if commit.breaking %}**Breaking:** {% endif %}\
{{ commit.message | split(pat="\\n") | first | upper_first | escape }}\
{% endfor %}
{% endfor %}
**Full Changelog:** [{{ previous.version }} {{ version }}]\
(https://code.host.antville.org/antville/helma/compare/\
{{ previous.version | urlencode }}..{{ version | urlencode }})\n\n
"""
footer = """
Generated by [git-cliff](https://git-cliff.org/).
"""
[git]
conventional_commits = false
filter_commits = false
filter_unconventional = false
protect_breaking_commits = false
sort_commits = "newest"
split_commits = false
topo_order = false
commit_parsers = [
{ message = "^Apply \\d+ suggestion", skip = true },
{ message = "^Merge .*(branch|dependabot|dependency|renovate)", skip = true },
{ message = "^Lock file maintenance", skip = true },
{ message = "yarn\\.lock", skip = true },
{ message = "^[Ff]ix", group = "<!-- 0 --> 🐛 Bug Fixes" },
{ field = "author.name", pattern = "[Rr]enovate|[Dd]ependabot", group = "<!-- 3 --> 📦 Dependency Updates" },
{ message = "^Merge pull request", group = "<!-- 1 --> 🔀 Merges" },
{ message = ".*", group = "<!-- 2 --> Uncategorized" },
]

60
src/dist/extras/deploy.sh vendored Normal file
View file

@ -0,0 +1,60 @@
#!/bin/sh
# Use this script as forced command of an authorized SSH key:
# command="/home/helma/extras/deploy.sh" ssh-ed25519 AAAAC3NzaC…
# Define HELMA_HOST and ANTVILLE_HOST in this file
# shellcheck source=/dev/null
. "$HOME"/deploy.env
case "$SSH_ORIGINAL_COMMAND" in
ping)
echo pong
;;
deploy-helma)
rsync ./ "$HELMA_HOST":./ \
--archive --compress --delete --verbose \
--filter '+ /bin' \
--filter '+ /extras' \
--filter '+ /launcher.jar' \
--filter '- /lib/ext' \
--filter '+ /lib' \
--filter '+ /modules' \
--filter '- /*'
printf 'Restarting Helma on HELMA_host… '
ssh "$HELMA_HOST" sudo /bin/systemctl restart helma
;;
deploy-antville)
rsync ./apps/antville/ "$ANTVILLE_HOST":./apps/antville/ \
--archive --compress --delete --verbose \
--filter '+ /claustra' \
--filter '+ /code' \
--filter '+ /compat' \
--filter '+ /i18n' \
--filter '+ /lib' \
--filter '- /*'
rsync ./apps/antville/static/helma/ "$ANTVILLE_HOST":./apps/antville/static/helma/ \
--archive --compress --verbose \
--filter '+ /fonts' \
--filter '+ /formica.html' \
--filter '+ /img' \
--filter '+ /scripts' \
--filter '+ /styles' \
--filter '- /*'
printf 'Restarting Helma on ANTVILLE_host… '
ssh "$ANTVILLE_HOST" sudo /bin/systemctl restart helma
;;
restart)
printf 'Restarting Helma… '
sudo /bin/systemctl restart helma
printf '%s\n' 'done.'
;;
*)
# Allow any rsync command but restrict it to the installation directory
rrsync -wo /home/helma
;;
esac

View file

@ -494,15 +494,15 @@ public class ApplicationManager implements XmlRpcHandler {
ContextHandler staticContext = new ContextHandler(); ContextHandler staticContext = new ContextHandler();
staticContext.setContextPath(staticMountpoint); staticContext.setContextPath(staticMountpoint);
// FIXME: Causing java.lang.IllegalArgumentException: Resource String is invalid
//staticContext.setBaseResourceAsString("");
staticContext.setHandler(rhandler); staticContext.setHandler(rhandler);
ApplicationManager.this.context.addHandler(staticContext); ApplicationManager.this.context.addHandler(staticContext);
staticContext.start(); staticContext.start();
} }
appContext = new ServletContextHandler(ServletContextHandler.SESSIONS); // I hope I am correct assuming Helma does not need Jettys session management, but using
// `ServletContextHandler.SESSIONS` causes an exception: Shared scheduler not started
appContext = new ServletContextHandler(ServletContextHandler.NO_SESSIONS);
appContext.setContextPath(pathPattern); appContext.setContextPath(pathPattern);
context.addHandler(appContext); context.addHandler(appContext);
@ -544,9 +544,7 @@ public class ApplicationManager implements XmlRpcHandler {
// Remap the context paths and start // Remap the context paths and start
ApplicationManager.this.context.mapContexts(); ApplicationManager.this.context.mapContexts();
// FIXME: Causing java.lang.IllegalStateException: Shared scheduler not started this.appContext.start();
// Is it necessary, anway?
//this.appContext.start();
} }
// register as XML-RPC handler // register as XML-RPC handler
@ -565,8 +563,8 @@ public class ApplicationManager implements XmlRpcHandler {
// unbind from Jetty HTTP server // unbind from Jetty HTTP server
if (ApplicationManager.this.jetty != null) { if (ApplicationManager.this.jetty != null) {
if (this.appContext != null) { if (this.appContext != null) {
// FIXME: Causing incompatible types: ServletContextHandler cannot be converted to Handler // Adding appContext to the ContextHandlerCollection works (see above) but removing it causes an exception of
// Is it necessary, anyway? // incompatible types: ServletContextHandler cannot be converted to Handler
//ApplicationManager.this.context.removeHandler(this.appContext); //ApplicationManager.this.context.removeHandler(this.appContext);
this.appContext.stop(); this.appContext.stop();
this.appContext.destroy(); this.appContext.destroy();

View file

@ -21,6 +21,7 @@ import helma.framework.repository.FileResource;
import helma.framework.core.*; import helma.framework.core.*;
import helma.objectmodel.db.DbSource; import helma.objectmodel.db.DbSource;
import helma.util.*; import helma.util.*;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.apache.xmlrpc.*; import org.apache.xmlrpc.*;
@ -152,8 +153,8 @@ public class Server implements Runnable {
String javaVersion = System.getProperty("java.version", "0"); String javaVersion = System.getProperty("java.version", "0");
int majorVersion = Integer.parseInt(javaVersion.split("\\.")[0]); int majorVersion = Integer.parseInt(javaVersion.split("\\.")[0]);
if (majorVersion < 11) { if (majorVersion < 17) {
System.err.println("This version of Helma requires Java 11 or greater."); System.err.println("This version of Helma requires Java 17 or greater.");
if (majorVersion == 0) { // don't think this will ever happen, but you never know if (majorVersion == 0) { // don't think this will ever happen, but you never know
System.err.println("Your Java Runtime did not provide a version number. Please update to a more recent version."); System.err.println("Your Java Runtime did not provide a version number. Please update to a more recent version.");