Compare commits

..

No commits in common. "25.1.3" and "v20240530🐜" have entirely different histories.

20 changed files with 209 additions and 203 deletions

View file

@ -1,42 +0,0 @@
name: SSH setup
description: Set up the SSH agent
inputs:
config:
description: The SSH configuration
required: true
key:
description: The private SSH key
required: true
known-hosts:
description: The list of known hosts
required: true
runs:
using: composite
steps:
- name: Configure SSH
shell: sh
env:
CONFIG: ${{ inputs.config }}
KNOWN_HOSTS: ${{ inputs.known-hosts }}
run: |
mkdir -p ~/.ssh
echo "${CONFIG}" > ~/.ssh/config
echo "${KNOWN_HOSTS}" > ~/.ssh/known_hosts
- name: Start SSH agent
shell: bash
env:
SOCKET: /tmp/ssh-agent.sock
run: |
echo "SSH_AUTH_SOCK=${SOCKET}" >> $GITHUB_ENV
ssh-agent -a ${SOCKET} > /dev/null
- name: Add SSH key
shell: bash
env:
KEY: ${{ inputs.key }}
run: |
ssh-add - <<< "${KEY}"

View file

@ -1,22 +0,0 @@
name: Deploy (Production)
on: workflow_dispatch
jobs:
deploy:
runs-on: ubuntu-latest
environment:
name: weblogs.at
url: https://weblogs.at
steps:
- name: Set up SSH agent
uses: antville/helma/.github/actions/ssh@helma-🐜
with:
config: ${{ vars.SSH_CONFIG }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
known-hosts: ${{ vars.SSH_KNOWN_HOSTS }}
- name: Copy files to production server
run: ssh staging-server deploy-helma

View file

@ -26,7 +26,7 @@ jobs:
java-version: 21 java-version: 21
- name: Set up Gradle - name: Set up Gradle
uses: gradle/actions/setup-gradle@v4 uses: gradle/actions/setup-gradle@v3
- name: Build with Gradle - name: Build with Gradle
run: ./gradlew assembleDist run: ./gradlew assembleDist

View file

@ -1,48 +0,0 @@
name: Deploy (Staging)
on: workflow_dispatch
jobs:
stage:
runs-on: ubuntu-latest
environment:
name: stage
url: https://antville-test.online
steps:
- uses: actions/checkout@v4
- name: Set up SSH agent
uses: ./.github/actions/ssh
with:
config: ${{ vars.SSH_CONFIG }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
known-hosts: ${{ vars.SSH_KNOWN_HOSTS }}
- name: Set up Java
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 21
- name: Set up Gradle
uses: gradle/actions/setup-gradle@v4
- name: Build with Gradle
run: ./gradlew installDist
- name: Publish to staging server
run: |
rsync ./build/install/helma/ staging-server:./ \
--verbose --archive --delete --compress \
--filter '+ /bin' \
--filter '+ /extras' \
--filter '+ /launcher.jar' \
--filter '- /lib/ext' \
--filter '+ /lib' \
--filter '+ /modules' \
--filter '- /*'
- name: Restart Helma
run: ssh staging-server restart

50
.github/workflows/staging.yml vendored Normal file
View file

@ -0,0 +1,50 @@
name: Staging
on:
workflow_dispatch
env:
SSH_AUTH_SOCK: /tmp/ssh-agent.sock
jobs:
install:
runs-on: ubuntu-latest
environment:
name: staging
url: https://antville-test.click
steps:
- uses: actions/checkout@v4
- name: Set up Java
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 21
- name: Set up Gradle
uses: gradle/actions/setup-gradle@v3
- name: Build with Gradle
run: ./gradlew installDist
- name: Set up SSH agent
run: |
ssh-agent -a $SSH_AUTH_SOCK > /dev/null
ssh-add - <<< "${{ secrets.SSH_PRIVATE_KEY }}"
mkdir -p ~/.ssh
echo '${{ vars.SSH_CONFIG }}' > ~/.ssh/config
echo '${{ vars.KNOWN_HOSTS }}' > ~/.ssh/known_hosts
- name: Publish to staging server
run: |
rsync build/install/helma/ antville.dev:/ \
--verbose --archive --delete --compress \
--filter '+ launcher.jar' \
--filter '+ lib' \
--filter '+ *.jar' \
--filter '- *' \
- name: Restart Helma
run: ssh antville.dev restart

View file

@ -1,6 +1,5 @@
{ {
"recommendations": [ "recommendations": [
"vscjava.vscode-java-pack", "vscjava.vscode-java-pack"
"vscjava.vscode-gradle"
] ]
} }

84
.vscode/launch.json vendored Normal file
View file

@ -0,0 +1,84 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "java",
"name": "Current File",
"request": "launch",
"mainClass": "${file}"
},
{
"type": "java",
"name": "ImageInfo",
"request": "launch",
"mainClass": "helma.image.ImageInfo",
"projectName": "helma_"
},
{
"type": "java",
"name": "CommandlineRunner",
"request": "launch",
"mainClass": "helma.main.CommandlineRunner",
"projectName": "helma_"
},
{
"type": "java",
"name": "Server",
"request": "launch",
"mainClass": "helma.main.Server",
"projectName": "helma_"
},
{
"type": "java",
"name": "XmlConverter",
"request": "launch",
"mainClass": "helma.objectmodel.dom.XmlConverter",
"projectName": "helma_"
},
{
"type": "java",
"name": "Crypt",
"request": "launch",
"mainClass": "helma.util.Crypt",
"projectName": "helma_"
},
{
"type": "java",
"name": "HtmlEncoder",
"request": "launch",
"mainClass": "helma.util.HtmlEncoder",
"projectName": "helma_"
},
{
"type": "java",
"name": "Logo",
"request": "launch",
"mainClass": "helma.util.Logo",
"projectName": "helma_"
},
{
"type": "java",
"name": "MarkdownProcessor",
"request": "launch",
"mainClass": "helma.util.MarkdownProcessor",
"projectName": "helma_"
},
{
"type": "java",
"name": "Commandline",
"request": "launch",
"mainClass": "helma.main.launcher.Commandline",
"projectName": "launcher"
},
{
"type": "java",
"name": "Main",
"request": "launch",
"mainClass": "helma.main.launcher.Main",
"projectName": "launcher"
}
]
}

View file

@ -2,7 +2,7 @@
## 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://github.com/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>
@ -21,9 +21,9 @@ Although Helma became a Grande Dame of server-side JavaScript already decades ag
## System Requirements ## System Requirements
You need a Java virtual machine version 11 or higher to run Helma. You need a Java virtual machine version 17 or higher to run Helma.
Please consult the documentation of your platform how to obtain and install Java. Please consult the documentation of your platform on how to obtain and install Java.
You also can directly download a [Java runtime or development kit](https://www.oracle.com/java/technologies/javase-downloads.html#javasejdk) from Oracle. You also can directly download a [Java runtime or development kit](https://www.oracle.com/java/technologies/javase-downloads.html#javasejdk) from Oracle.
@ -33,12 +33,10 @@ Helma is built with [Gradle](https://gradle.org), the build task depends on the
### Additional Prerequisites ### Additional Prerequisites
* [Node.js](https://nodejs.org) LTS version
* [Rsync](https://rsync.samba.org) version ≥ 3.1.0 * [Rsync](https://rsync.samba.org) version ≥ 3.1.0
* [Node.js](https://nodejs.org) LTS version
Clone this repository to your machine and run Helma with `./gradlew run`. Clone this repository to your machine and start the build process with `./gradlew install`. The build script is going to ask you if you want to update the installation, enter `yes` or `no`.
To update the installation from a build, run `./gradlew update` and enter `yes` at the prompt.
> ⚠️ > ⚠️
> Please be aware that this step is going to overwrite files in the installation directory escpecially at a later time when there might be substantial changes. Should this happen by accident you find the previous installation in the `backups` directory. > Please be aware that this step is going to overwrite files in the installation directory escpecially at a later time when there might be substantial changes. Should this happen by accident you find the previous installation in the `backups` directory.

View file

@ -1,6 +1,6 @@
plugins { plugins {
id 'application' id 'application'
id 'com.github.jk1.dependency-license-report' version '2.9' id 'com.github.jk1.dependency-license-report' version '2.7'
} }
import org.apache.tools.ant.filters.FixCrLfFilter import org.apache.tools.ant.filters.FixCrLfFilter
@ -17,9 +17,9 @@ def textFiles = ['**/*.hac', '**/.html', '**/*.js', '**/*.md', '**/*.properties'
allprojects { allprojects {
apply plugin: 'java' apply plugin: 'java'
java { compileJava {
sourceCompatibility = JavaVersion.VERSION_11 sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_17
} }
repositories { repositories {
@ -27,7 +27,7 @@ allprojects {
} }
} }
version = new Date().format("yy.M.d") version = new Date().format("yyyyMMdd")
tasks.build.dependsOn javadoc, 'jsdoc', 'generateLicenseReport' tasks.build.dependsOn javadoc, 'jsdoc', 'generateLicenseReport'
tasks.compileJava.dependsOn 'processSource' tasks.compileJava.dependsOn 'processSource'
@ -59,15 +59,15 @@ configurations {
dependencies { dependencies {
implementation 'com.google.code.gson:gson:2.11.0' implementation 'com.google.code.gson:gson:2.11.0'
implementation 'commons-codec:commons-codec:1.17.1' implementation 'commons-codec:commons-codec:1.17.0'
implementation 'commons-fileupload:commons-fileupload:1.5' implementation 'commons-fileupload:commons-fileupload:1.5'
implementation 'commons-logging:commons-logging:1.3.4' implementation 'commons-logging:commons-logging:1.3.2'
implementation 'commons-net:commons-net:3.11.1' implementation 'commons-net:commons-net:3.10.0'
implementation 'com.sun.mail:javax.mail:1.6.2' implementation 'com.sun.mail:javax.mail:1.6.2'
implementation 'javax.servlet:javax.servlet-api:4.0.1' implementation 'javax.servlet:javax.servlet-api:4.0.1'
implementation 'org.ccil.cowan.tagsoup:tagsoup:1.2.1' implementation 'org.ccil.cowan.tagsoup:tagsoup:1.2.1'
implementation 'org.eclipse.jetty:jetty-servlet:9.4.56.v20240826' implementation 'org.eclipse.jetty:jetty-servlet:9.4.54.v20240208'
implementation 'org.eclipse.jetty:jetty-xml:9.4.56.v20240826' implementation 'org.eclipse.jetty:jetty-xml:9.4.54.v20240208'
implementation 'org.mozilla:rhino:1.7.13' implementation 'org.mozilla:rhino:1.7.13'
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'
@ -78,37 +78,6 @@ def rhinoJar = configurations.library.files.find { jar ->
jar.name.startsWith('rhino') jar.name.startsWith('rhino')
} }
run {
jvmArgs jettyLogLevel, suppressMacosDockIcon
classpath += fileTree(dir: 'lib/ext', include: '*.jar')
}
application {
mainClass = 'helma.main.Server'
applicationDistribution.from(projectDir) {
include 'modules/**'
include 'LICENSE.md'
include 'README.md'
include 'start.*'
}
applicationDistribution.from(javadoc.destinationDir) {
include '**'
into 'docs/javadoc'
}
applicationDistribution.from("${project.buildDir}/docs/jsdoc") {
include '**'
into 'docs/jsdoc'
}
applicationDistribution.from("${project.buildDir}/reports/dependency-license") {
include '**'
into 'licenses'
}
}
startScripts { startScripts {
applicationName = 'helma' applicationName = 'helma'
classpath = files('../launcher.jar') classpath = files('../launcher.jar')
@ -134,6 +103,30 @@ distributions {
} }
} }
application {
applicationDistribution.from(projectDir) {
include 'modules/**'
include 'LICENSE.md'
include 'README.md'
include 'start.*'
}
applicationDistribution.from(javadoc.destinationDir) {
include '**'
into 'docs/javadoc'
}
applicationDistribution.from("${project.buildDir}/docs/jsdoc") {
include '**'
into 'docs/jsdoc'
}
applicationDistribution.from("${project.buildDir}/reports/dependency-license") {
include '**'
into 'licenses'
}
}
distTar { distTar {
dependsOn ':generateLicenseReport', ':javadoc', ':jsdoc' dependsOn ':generateLicenseReport', ':javadoc', ':jsdoc'
@ -154,30 +147,42 @@ distZip {
installDist { installDist {
dependsOn build dependsOn build
if (!System.getenv('CI')) {
finalizedBy 'update'
}
} }
tasks.register('processSource', Sync) { run {
classpath = files('launcher.jar')
jvmArgs jettyLogLevel, suppressMacosDockIcon
}
task processSource(type: Sync) {
def date = new Date().format("MMMM dd, yyyy")
def gitOutput = new ByteArrayOutputStream() def gitOutput = new ByteArrayOutputStream()
exec { exec {
commandLine 'git', 'rev-parse', '--short', 'HEAD' commandLine 'git', 'describe'
standardOutput = gitOutput standardOutput = gitOutput
errorOutput = new ByteArrayOutputStream() errorOutput = new ByteArrayOutputStream()
ignoreExitValue = true ignoreExitValue = true
} }
def description = date
def tag = gitOutput.toString().trim()
// TODO: Implement extended description in Java code
if (tag) description = "$tag; $description"
from 'src' from 'src'
filter { filter {
line -> line line -> line.replaceAll('__builddate__', date)
.replaceAll('__builddate__', new Date().format("d MMM yyyy"))
.replaceAll('__commithash__', gitOutput.toString().trim())
} into "${project.buildDir}/src" } into "${project.buildDir}/src"
} }
tasks.register('update') { task update {
dependsOn installDist
def rsyncArgs = ['--archive', '--filter', '- backups'] def rsyncArgs = ['--archive', '--filter', '- backups']
def confirm = { def confirm = {
@ -221,7 +226,7 @@ tasks.register('update') {
} }
} }
tasks.register('jsdoc', Exec) { task jsdoc(type: Exec) {
description 'Generates JSDoc API documentation for the included JavaScript modules.' description 'Generates JSDoc API documentation for the included JavaScript modules.'
group 'Documentation' group 'Documentation'
@ -235,7 +240,7 @@ tasks.register('jsdoc', Exec) {
args = ['jsdoc', '-d', "$destination"].plus(sources) args = ['jsdoc', '-d', "$destination"].plus(sources)
} }
tasks.register('xgettext', JavaExec) { task xgettext(type: JavaExec) {
description 'Extracts translatable message strings from source code.' description 'Extracts translatable message strings from source code.'
group 'i18n' group 'i18n'
@ -252,7 +257,7 @@ tasks.register('xgettext', JavaExec) {
] ]
} }
tasks.register('po2js', JavaExec) { task po2js(type: JavaExec) {
description 'Converts translated message strings from PO format to JavaScript.' description 'Converts translated message strings from PO format to JavaScript.'
group 'i18n' group 'i18n'
@ -267,7 +272,7 @@ tasks.register('po2js', JavaExec) {
] ]
} }
tasks.register('rhinoShell', JavaExec) { task rhinoShell(type: JavaExec) {
description 'Runs the interactive Rhino JavaScript shell.' description 'Runs the interactive Rhino JavaScript shell.'
group 'Application' group 'Application'
@ -279,7 +284,7 @@ tasks.register('rhinoShell', JavaExec) {
// Call this task with a function definition using the `-P` parameter, e.g. // Call this task with a function definition using the `-P` parameter, e.g.
// `./gradlew commandLine -Pfunction=manage.getAllApplications` // `./gradlew commandLine -Pfunction=manage.getAllApplications`
tasks.register('commandLine', JavaExec) { task commandLine(type: JavaExec) {
description 'Runs a function in a Helma application with `-Pfunction=app.functionName`.' description 'Runs a function in a Helma application with `-Pfunction=app.functionName`.'
group 'Application' group 'Application'
@ -287,11 +292,3 @@ tasks.register('commandLine', JavaExec) {
mainClass = 'helma.main.launcher.Commandline' mainClass = 'helma.main.launcher.Commandline'
args '-h', projectDir, function args '-h', projectDir, function
} }
tasks.register('debug', JavaExec) {
group = 'application'
main = 'helma.main.Server'
classpath = sourceSets.main.runtimeClasspath
jvmArgs = ['-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005']
classpath += fileTree(dir: 'lib/ext', include: '*.jar')
}

Binary file not shown.

View file

@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
networkTimeout=10000 networkTimeout=10000
validateDistributionUrl=true validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME

6
gradlew vendored
View file

@ -15,8 +15,6 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
# #
# SPDX-License-Identifier: Apache-2.0
#
############################################################################## ##############################################################################
# #
@ -57,7 +55,7 @@
# Darwin, MinGW, and NonStop. # Darwin, MinGW, and NonStop.
# #
# (3) This script is generated from the Groovy template # (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project. # within the Gradle project.
# #
# You can find Gradle at https://github.com/gradle/gradle/. # You can find Gradle at https://github.com/gradle/gradle/.
@ -86,7 +84,7 @@ done
# shellcheck disable=SC2034 # shellcheck disable=SC2034
APP_BASE_NAME=${0##*/} APP_BASE_NAME=${0##*/}
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value. # Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum MAX_FD=maximum

2
gradlew.bat vendored
View file

@ -13,8 +13,6 @@
@rem See the License for the specific language governing permissions and @rem See the License for the specific language governing permissions and
@rem limitations under the License. @rem limitations under the License.
@rem @rem
@rem SPDX-License-Identifier: Apache-2.0
@rem
@if "%DEBUG%"=="" @echo off @if "%DEBUG%"=="" @echo off
@rem ########################################################################## @rem ##########################################################################

View file

View file

@ -12,7 +12,7 @@ processResources.enabled = false
processTestResources.enabled = false processTestResources.enabled = false
test.enabled = false test.enabled = false
tasks.register('deps', Copy) { task deps(type: Copy) {
from sourceSets.main.runtimeClasspath from sourceSets.main.runtimeClasspath
into '.' into '.'
} }

View file

@ -15,7 +15,7 @@ processResources.enabled = false
processTestResources.enabled = false processTestResources.enabled = false
test.enabled = false test.enabled = false
tasks.register('deps', Copy) { task deps(type: Copy) {
from sourceSets.main.runtimeClasspath from sourceSets.main.runtimeClasspath
into 'lib' into 'lib'
} }

View file

@ -10,7 +10,7 @@ processResources.enabled = false
processTestResources.enabled = false processTestResources.enabled = false
test.enabled = false test.enabled = false
tasks.register('deps', Copy) { task deps(type: Copy) {
from sourceSets.main.runtimeClasspath from sourceSets.main.runtimeClasspath
into 'lib' into 'lib'
} }

View file

@ -10,7 +10,7 @@ processResources.enabled = false
processTestResources.enabled = false processTestResources.enabled = false
test.enabled = false test.enabled = false
tasks.register('deps', Copy) { task deps(type: Copy) {
from sourceSets.main.runtimeClasspath from sourceSets.main.runtimeClasspath
into 'code' into 'code'
} }

View file

@ -18,7 +18,7 @@ ExecStart = /usr/bin/java -server \
-jar launcher.jar \ -jar launcher.jar \
-w 8080 -x 8081 -w 8080 -x 8081
ExecReload = /bin/sh -c 'touch apps.properties && touch server.properties' ExecReload = touch apps.properties && touch server.properties
ExecStop = /bin/kill -15 $MAINPID ExecStop = /bin/kill -15 $MAINPID
[Install] [Install]

View file

@ -36,13 +36,7 @@ import helma.util.ResourceProperties;
*/ */
public class Server implements Runnable { public class Server implements Runnable {
// version string // version string
public static final String version = "🐜"; public static final String version = "🐜 (__builddate__)";
// build date
public static final String buildDate = "__builddate__";
// commit hash
public static final String commitHash = "__commithash__";
// static server instance // static server instance
private static Server server; private static Server server;