Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
289bc42
Update for Grails 7 compatibility
fdevans Jan 2, 2026
de4a8da
Update GitHub workflow to use Java 17 for Grails 7 compatibility
fdevans Jan 4, 2026
d459f13
Update rundeck-core dependency to 6.0.0-SNAPSHOT for Grails 7 compati…
fdevans Jan 4, 2026
3a415d5
Add Central Portal Snapshots repository for rundeck-core:6.0.0-SNAPSHOT
fdevans Jan 6, 2026
6817817
Prepare http-notification for JitPack with Java 17 and Central Portal…
fdevans Jan 6, 2026
05b4958
Update http-step dependency to 1.1.12-grails7-upgrade-test
fdevans Jan 6, 2026
7571537
Bump version to 1.0.13-grails7-upgrade-test
fdevans Jan 6, 2026
f767410
Fix commons-lang3 version conflict
fdevans Jan 7, 2026
435a92f
Standardize on commons-lang3:3.18.0
fdevans Jan 7, 2026
9fac7d6
Downgrade commons-lang3 to 3.17.0 for Grails 7 compatibility
fdevans Jan 7, 2026
4548e19
Bump version to 1.0.17 due to JitPack build timeout
fdevans Jan 7, 2026
be867f9
Bump version to 1.0.18-grails7-upgrade-test and update http-step depe…
fdevans Jan 7, 2026
2269d9a
Modernize build and bump to 1.0.19-grails7-upgrade-test
fdevans Jan 7, 2026
fc4d176
Bump to 1.0.20-grails7-upgrade-test
fdevans Jan 8, 2026
7a2a7ef
Major cleanup and bump to 1.0.21-grails7-upgrade-test
fdevans Jan 8, 2026
65cf000
Migrate to PackageCloud: restore Axion, change groupId to com.rundeck…
fdevans Jan 8, 2026
73d3e82
Fix http-notification: Add Groovy plugin and compilation dependencies
fdevans Jan 9, 2026
f9b3a30
Merge remote-tracking branch 'origin/master' into grails7-upgrade
fdevans Mar 27, 2026
cc43e82
Fix CVE-2025-48924 + Java 17 test compatibility
fdevans Mar 27, 2026
f628f71
Modernize GitHub Actions workflows for Node.js 24 compatibility
fdevans Mar 27, 2026
e6e1ec6
Fix setup-java@v4 missing required distribution parameter
fdevans Mar 27, 2026
d0f586e
Revert http-step dependency to 1.1.20-grails7 to unblock CI
fdevans Mar 27, 2026
d10d12f
Standardize Gradle version to 8.14.3
fdevans Mar 27, 2026
b28c9d0
Fix YAML indentation for distribution parameter
fdevans Mar 27, 2026
d3a613a
Fix YAML indentation and update Gradle wrapper scripts
fdevans Mar 27, 2026
239bf0e
Fix JDK version typo and standardize java-version format
fdevans Mar 28, 2026
458cbda
Update commons-lang3 to 3.20.0 to match rundeck core
fdevans Apr 2, 2026
07be7aa
Fix JAR artifact path to match actual build output (remove -plugin su…
fdevans Apr 3, 2026
efe48fa
Add Maven Publishing.
fdevans Apr 6, 2026
ef93360
Update build.gradle
fdevans Apr 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 8 additions & 7 deletions .github/workflows/gradle.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,27 +8,28 @@ jobs:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Get Fetch Tags
run: git -c protocol.version=2 fetch --tags --progress --no-recurse-submodules origin
if: "!contains(github.ref, 'refs/tags')"
- name: Set up JDK 1.8
uses: actions/setup-java@v1
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: 11
java-version: '17'
distribution: 'zulu'
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build with Gradle
run: ./gradlew build
- name: Get Release Version
id: get_version
run: VERSION=$(./gradlew currentVersion -q -Prelease.quiet) && echo ::set-output name=VERSION::$VERSION
run: VERSION=$(./gradlew currentVersion -q -Prelease.quiet) && echo "VERSION=$VERSION" >> $GITHUB_OUTPUT
- name: Upload plugin jar
uses: actions/upload-artifact@v4.4.1
uses: actions/upload-artifact@v4
with:
# Artifact name
name: Grails-Plugin-${{ steps.get_version.outputs.VERSION }}
# Directory containing files to upload
path: build/libs/http-notification-plugin-${{ steps.get_version.outputs.VERSION }}.jar
path: build/libs/http-notification-${{ steps.get_version.outputs.VERSION }}.jar
46 changes: 21 additions & 25 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -1,46 +1,42 @@
on:
push:
# Sequence of patterns matched against refs/tags
tags:
- '*' # Push events to matching v*, i.e. v1.0, v20.15.10
- '*.*.*'

name: Upload Release Asset
name: Publish Release

jobs:
build:
name: Upload Release Asset
name: Publish Release
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: set up JDK 1.8
uses: actions/setup-java@v1
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: 11
java-version: '17'
distribution: 'zulu'
- name: Build with Gradle
run: ./gradlew build
- name: Get Release Version
id: get_version
run: VERSION=$(./gradlew currentVersion -q -Prelease.quiet) && echo ::set-output name=VERSION::$VERSION
run: VERSION=$(./gradlew currentVersion -q -Prelease.quiet) && echo "VERSION=$VERSION" >> $GITHUB_OUTPUT
- name: Create Release
id: create_release
uses: actions/create-release@v1.0.0
run: |
gh release create \
--generate-notes \
--title 'Release ${{ steps.get_version.outputs.VERSION }}' \
${{ github.ref_name }} \
build/libs/http-notification-${{ steps.get_version.outputs.VERSION }}.jar
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ github.ref }}
release_name: Release ${{ steps.get_version.outputs.VERSION }}
draft: false
prerelease: false
- name: Upload Release Asset (jar)
id: upload-release-asset
uses: actions/upload-release-asset@v1
- name: Publish to Maven Central
run: ./gradlew -PsigningKey=${SIGNING_KEY_B64} -PsigningPassword=${SIGNING_PASSWORD} -PsonatypeUsername=${SONATYPE_USERNAME} -PsonatypePassword=${SONATYPE_PASSWORD} publishToSonatype closeAndReleaseSonatypeStagingRepository
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ steps.create_release.outputs.upload_url }}
asset_path: build/libs/http-notification-plugin-${{ steps.get_version.outputs.VERSION }}.jar
asset_name: http-notification-plugin-${{ steps.get_version.outputs.VERSION }}.jar
asset_content_type: application/octet-stream
SONATYPE_USERNAME: ${{ secrets.SONATYPE_USERNAME }}
SONATYPE_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }}
SIGNING_KEY_B64: ${{ secrets.SIGNING_KEY_B64 }}
SIGNING_PASSWORD: ${{ secrets.SIGNING_PASSWORD }}
157 changes: 83 additions & 74 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,45 +1,38 @@

buildscript {
repositories {
mavenCentral()
maven { url "https://oss.sonatype.org/content/groups/public"}
}
}

plugins {
id 'pl.allegro.tech.build.axion-release' version '1.13.4'
id 'pl.allegro.tech.build.axion-release' version '1.17.2'
id 'groovy'
id 'java'
id 'io.github.gradle-nexus.publish-plugin' version '2.0.0'
}

group 'com.rundeck.plugin'

apply plugin: 'pl.allegro.tech.build.axion-release'
apply plugin: 'groovy'
apply plugin: 'java'

sourceCompatibility = 11
ext.rundeckPluginVersion = '1.2'
ext.pluginClassNames='com.rundeck.plugin.HttpNotificationPlugin'
ext.pluginName = 'Http Notification'
ext.pluginDescription = 'A notification plugin that makes HTTP requests'
group 'org.rundeck.plugins'

ext.publishName = "Http Notification ${project.version}"
ext.githubSlug = 'rundeck-plugins/http-notification'
ext.developers = [
[id: 'gschueler', name: 'Greg Schueler', email: 'greg@rundeck.com']
]

scmVersion {
ignoreUncommittedChanges = true
ignoreUncommittedChanges = false
tag {
prefix = ''
prefix = '' // NO "v" prefix - see PLUGIN_TAGGING_ARCHITECTURE.md
versionSeparator = ''
def origDeserialize=deserialize
//apend .0 to satisfy semver if the tag version is only X.Y
deserialize = { config, position, tagName ->
def orig = origDeserialize(config, position, tagName)
if (orig.split('\\.').length < 3) {
orig += ".0"
}
orig
}
}
}
project.version = scmVersion.version

version = scmVersion.version // Dynamic version from git tag

java {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
withSourcesJar()
withJavadocJar()
}
ext.rundeckPluginVersion = '1.2'
ext.pluginClassNames='com.rundeck.plugin.HttpNotificationPlugin'
ext.pluginName = 'Http Notification'
ext.pluginDescription = 'A notification plugin that makes HTTP requests'

configurations{
//declare custom pluginLibs configuration to include only libs for this plugin
Expand All @@ -52,54 +45,55 @@ configurations{
}

repositories {
mavenCentral()
mavenLocal()
maven { url 'https://jitpack.io' }

}

dependencies {
implementation 'org.rundeck:rundeck-core:5.14.0-rc1-20250722'

pluginLibs ('com.github.rundeck-plugins:http-step:1.1.6'){
exclude group: 'org.rundeck', module: 'rundeck-core'
maven {
name = 'Central Portal Snapshots'
url = 'https://central.sonatype.com/repository/maven-snapshots/'
content {
includeGroup('org.rundeck')
}
}

implementation group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.5.14'
implementation 'org.codehaus.groovy:groovy-all:3.0.9'

// Add secure commons-lang3 to provide alternative to vulnerable commons-lang 2.6
implementation 'org.apache.commons:commons-lang3:3.18.0'

testImplementation group: 'junit', name: 'junit', version: '4.13.1'

testImplementation "org.codehaus.groovy:groovy-all:3.0.17"
testImplementation "org.spockframework:spock-core:2.0-groovy-3.0"
testImplementation "cglib:cglib-nodep:2.2.2"
testImplementation 'org.objenesis:objenesis:1.4'

}

configurations.all {
resolutionStrategy {
// Replace vulnerable commons-lang with secure commons-lang3
dependencySubstitution {
substitute module('commons-lang:commons-lang') using module('org.apache.commons:commons-lang3:3.18.0')
maven {
name = "PackageCloudTest"
url = uri("https://packagecloud.io/pagerduty/rundeckpro-test/maven2")
content {
includeGroup('org.rundeck.plugins')
}
}
mavenCentral()
}

dependencies {
implementation 'org.apache.groovy:groovy-all:4.0.29'
compileOnly 'org.rundeck:rundeck-core:6.0.0-alpha1-20260407'
testImplementation 'org.rundeck:rundeck-core:6.0.0-alpha1-20260407'

// Apache HTTP client dependencies for compilation (http-step bundles these but doesn't expose them transitively)
implementation 'org.apache.httpcomponents:httpclient:4.5.14'
// Version 3.18.0 fixes CVE-2025-48924 (StackOverflowError in ClassUtils)
implementation 'org.apache.commons:commons-lang3:3.20.0'

// Bundle http-step plugin in lib/ directory for runtime
// Use transitive=false to avoid duplicating dependencies already bundled in http-step JAR
pluginLibs ('org.rundeck.plugins:http-step:1.1.20-grails7') {
transitive = false
}

// task to copy plugin libs to output/lib dir
task copyToLib(type: Copy) {
into "$buildDir/output/lib"
from configurations.pluginLibs
testImplementation group: 'junit', name: 'junit', version: '4.13.2'
testImplementation "org.apache.groovy:groovy-all:4.0.29"
testImplementation "org.spockframework:spock-core:2.4-groovy-4.0"
testImplementation "net.bytebuddy:byte-buddy:1.14.11"
testImplementation 'org.objenesis:objenesis:3.4'
}



jar {
from "$buildDir/output"
// Include plugin dependencies in lib/ directory
into('lib') {
from configurations.pluginLibs
}

manifest {
def libList = configurations.pluginLibs.collect{'lib/' + it.name}.join(' ')
attributes 'Rundeck-Plugin-Name' : pluginName
Expand All @@ -115,13 +109,28 @@ jar {
attributes 'Rundeck-Plugin-Archive': 'true'
attributes 'Rundeck-Plugin-Libs': "${libList}"
}
dependsOn(copyToLib)
}

test {
useJUnit()

// Java 17+ module access for reflection/mocking
jvmArgs = [
'--add-opens=java.base/java.lang=ALL-UNNAMED',
'--add-opens=java.base/java.util=ALL-UNNAMED',
'--add-opens=java.base/java.lang.reflect=ALL-UNNAMED',
'--add-opens=java.base/java.net=ALL-UNNAMED'
]
}

//set jar task to depend on copyToLib
jar.dependsOn(copyToLib)
nexusPublishing {
packageGroup = 'org.rundeck.plugins'
repositories {
sonatype {
nexusUrl.set(uri("https://ossrh-staging-api.central.sonatype.com/service/local/"))
snapshotRepositoryUrl.set(uri("https://central.sonatype.com/repository/maven-snapshots/"))
}
}
}

tasks.withType(Test) {
useJUnitPlatform()
}
apply from: "${rootDir}/gradle/publishing.gradle"
86 changes: 86 additions & 0 deletions gradle/publishing.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
/**
* Define project extension values in the project gradle file before including this file:
*
* publishName = 'Name of Package'
* publishDescription = 'description' (optional)
* githubSlug = Github slug e.g. 'rundeck/rundeck-cli'
* developers = [ [id:'id', name:'name', email: 'email' ] ] list of developers
*
* Define project properties to sign and publish when invoking publish task:
*
* ./gradlew \
* -PsigningKey="base64 encoded gpg key" \
* -PsigningPassword="password for key" \
* -PsonatypeUsername="sonatype token user" \
* -PsonatypePassword="sonatype token password" \
* publishToSonatype closeAndReleaseSonatypeStagingRepository
*/
apply plugin: 'maven-publish'
apply plugin: 'signing'

publishing {
publications {
"${project.name}"(MavenPublication) { publication ->
from components.java

pom {
name = publishName
description = project.ext.hasProperty('publishDescription') ? project.ext.publishDescription :
project.description ?: publishName
url = "https://github.com/${githubSlug}"
licenses {
license {
name = 'The Apache Software License, Version 2.0'
url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
distribution = 'repo'
}
}
scm {
url = "https://github.com/${githubSlug}"
connection = "scm:git:git@github.com/${githubSlug}.git"
developerConnection = "scm:git:git@github.com:${githubSlug}.git"
}
if (project.ext.developers) {
developers {
project.ext.developers.each { dev ->
developer {
id = dev.id
name = dev.name
email = dev.email
}
}
}
}
}

}
}
repositories {
def pkgcldWriteToken = System.getenv("PKGCLD_WRITE_TOKEN") ?: project.findProperty("pkgcldWriteToken")
if (pkgcldWriteToken) {
maven {
name = "PackageCloudTest"
url = uri("https://packagecloud.io/pagerduty/rundeckpro-test/maven2")
authentication {
header(HttpHeaderAuthentication)
}
credentials(HttpHeaderCredentials) {
name = "Authorization"
value = "Bearer " + pkgcldWriteToken
}
}
}
}
}
def base64Decode = { String prop ->
project.findProperty(prop) ?
new String(Base64.getDecoder().decode(project.findProperty(prop).toString())).trim() :
null
}

if (project.hasProperty('signingKey') && project.hasProperty('signingPassword')) {
signing {
useInMemoryPgpKeys(base64Decode("signingKey"), project.signingPassword)
sign(publishing.publications)
}
}
Binary file modified gradle/wrapper/gradle-wrapper.jar
Binary file not shown.
Loading
Loading