Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
57e1686
Update README.md
rmeloamaro Apr 16, 2025
cdf1556
Update for Grails 7 compatibility
fdevans Jan 2, 2026
c3a2141
Fix scmVersion prefix for JitPack compatibility
fdevans Jan 3, 2026
8369d75
Remove scmVersion.version assignment - use only hardcoded version
fdevans Jan 3, 2026
8646695
Remove scmVersion plugin entirely - using only hardcoded version for …
fdevans Jan 3, 2026
1da801e
Bump version to 2.1.5-grails7-upgrade-test to bypass JitPack cache
fdevans Jan 3, 2026
4866c2d
Migrate to PackageCloud: restore Axion, change groupId to com.rundeck…
fdevans Jan 8, 2026
2411f9d
Remove pom.packaging declaration to fix @zip qualifier resolution
fdevans Jan 9, 2026
efe7262
Publish with extension=jar (no @zip qualifier) for PackageCloud Maven…
fdevans Jan 9, 2026
1a6adad
Fix plugin.yaml token replacement for py-winrm-plugin
fdevans Jan 9, 2026
c6c2cc0
Modernize release workflow for Grails 7
fdevans Feb 19, 2026
b0a179d
Update build workflow to Java 17 for Grails 7
fdevans Feb 19, 2026
7c8eeb0
Drop Python 2 support and update Python version requirements
fdevans Mar 18, 2026
fc69082
Merge pull request #110 from rmeloamaro/patch-2
fdevans Mar 18, 2026
c0fbb1f
Modernize GitHub Actions workflows for Node.js 24 compatibility
fdevans Mar 27, 2026
7b80f0a
Standardize Gradle version to 8.14.3
fdevans Mar 27, 2026
e36336e
Fix YAML indentation for distribution parameter
fdevans Mar 27, 2026
6cbbef2
Fix YAML indentation and update Gradle wrapper scripts
fdevans Mar 27, 2026
fb1f096
Fix YAML indentation in build.yml
fdevans Mar 27, 2026
b7e6fec
Change Python interpreter default to python3 and remove .temp/ build log
fdevans Apr 3, 2026
897f761
Add .temp to .gitignore
fdevans Apr 3, 2026
8eb7872
fixup release process
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
11 changes: 6 additions & 5 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,22 +8,23 @@ 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
- name: Set up JDK 1.8
uses: actions/setup-java@v1
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: 1.8
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 py-winrm-plugin zip
uses: actions/upload-artifact@v4
with:
Expand Down
48 changes: 21 additions & 27 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -1,48 +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: Create Release
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: 1.8
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/py-winrm-plugin-${{ steps.get_version.outputs.VERSION }}.zip
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 Plugin (zip)
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 }} # This pulls from the CREATE RELEASE step above, referencing it's ID to get its outputs object, which include a `upload_url`. See this blog post for more info: https://jasonet.co/posts/new-features-of-github-actions/#passing-data-to-future-steps
asset_path: ./build/libs/py-winrm-plugin-${{ steps.get_version.outputs.VERSION }}.zip
asset_name: py-winrm-plugin-${{ steps.get_version.outputs.VERSION }}.zip
asset_content_type: application/zip

SONATYPE_USERNAME: ${{ secrets.SONATYPE_USERNAME }}
SONATYPE_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }}
SIGNING_KEY_B64: ${{ secrets.SIGNING_KEY_B64 }}
SIGNING_PASSWORD: ${{ secrets.SIGNING_PASSWORD }}
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,7 @@ gradle-app.setting
# # Work around https://youtrack.jetbrains.com/issue/IDEA-116898
# gradle/wrapper/gradle-wrapper.properties

# End of https://www.gitignore.io/api/java,gradle
# End of https://www.gitignore.io/api/java,gradle

# Local build logs
.temp
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ Download from the releases page and copy the py-winrm-plugin-X.X.X.zip to the li
## Requirements

* Linux, Mac OS X or Windows
* CPython 2.6-2.7, 3.3-3.5 or PyPy2
* CPython 3.8+ or PyPy3
* pywinrm
Comment on lines 9 to 13
Copy link

Copilot AI Apr 2, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The PR title/description focuses on a Grails 7 / Rundeck 6 migration, but this repository and the changes shown here are for the Python WinRM plugin (Python/Gradle wrapper, interpreter options, CI). Please update the PR title/description to accurately reflect the scope of this plugin upgrade (Python/Gradle/CI), or add the missing Grails/Rundeck-related changes if they were intended.

Copilot uses AI. Check for mistakes.
* openssl 1.1.1 or higher
* requests-kerberos and requests-credssp is optional
Expand Down
108 changes: 88 additions & 20 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,28 +1,18 @@
import org.apache.tools.ant.filters.ReplaceTokens

buildscript {
repositories {
mavenCentral()
}
}

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

scmVersion {
ignoreUncommittedChanges = true
tag {
prefix = ''
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
}
}
}
group = 'org.rundeck.plugins'

ext.pluginName = 'py-winrm-plugin'
ext.pluginDescription = "Python Winrm Node Executor/File Copier Plugin. Connect to remote windows nodes using WINRM"
Expand All @@ -32,8 +22,86 @@ ext.buildDateString=new Date().format("yyyy-MM-dd'T'HH:mm:ssX")
ext.archivesBaseName = "py-winrm-plugin"
ext.pluginBaseFolder = "."

project.version = scmVersion.version
scmVersion {
ignoreUncommittedChanges = false
tag {
prefix = '' // NO "v" prefix - see PLUGIN_TAGGING_ARCHITECTURE.md
versionSeparator = ''
}
versionCreator 'simple' // Use simple version creator (just tag name)
}

version = scmVersion.version // Dynamic version from git tag
ext.publishName = "Python WinRM Plugin ${project.version}"
ext.githubSlug = 'rundeck-plugins/py-winrm-plugin'
ext.developers = [
[id: 'gschueler', name: 'Greg Schueler', email: 'greg@rundeck.com']
]

// ZIP plugin task - must use Jar type for proper manifest handling
task pluginZip(type: Jar) {
archiveBaseName = archivesBaseName
archiveVersion = version
archiveClassifier = ''
archiveExtension = 'zip'
destinationDirectory = layout.buildDirectory.dir('libs')

from(layout.buildDirectory.dir('zip-contents')) {
include('*.yaml')
include('contents/*')
into("${archivesBaseName}-" + project.version.toString())
}

ext.archiveFilename = ext.archivesBaseName + '-' + version
manifest {
attributes(
'Rundeck-Plugin-Name': pluginName,
'Rundeck-Plugin-Description': pluginDescription,
'Rundeck-Plugin-Archive': 'true',
'Rundeck-Plugin-File-Version': project.version.toString(),
'Rundeck-Plugin-Author': sopsCopyright,
'Rundeck-Plugin-URL': sopsUrl,
'Rundeck-Plugin-Date': buildDateString
)
}
}

pluginZip.doFirst {
def assetsMap = new Properties()
def tokens = assetsMap + [
version : project.version.toString(),
date : buildDateString,
author : sopsCopyright,
url : sopsUrl,
title : pluginName,
description: pluginDescription,
name : archivesBaseName,
]

copy {
from(file('contents')) {
into('contents')
}

from('plugin.yaml') {
filter(ReplaceTokens, tokens: tokens)
exclude('**/*.png')
}

into(layout.buildDirectory.dir('zip-contents'))
}
}

// Wire into build lifecycle
assemble.dependsOn pluginZip

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/"))
}
}
}

apply from: 'https://raw.githubusercontent.com/rundeck-plugins/build-zip/gradle-5.6/build.gradle'
apply from: "${rootDir}/gradle/publishing.gradle"
2 changes: 1 addition & 1 deletion docker/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ services:
build:
context: rundeck
args:
PYTHON_VERSION: "3.7.3"
PYTHON_VERSION: "3.11"
environment:
- RUNDECK_GRAILS_URL=http://localhost:4441
ports:
Expand Down
80 changes: 80 additions & 0 deletions gradle/publishing.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
/**
* Zip-based Rundeck plugin publication for Maven Central (artifact uploaded as type jar).
* Requires: ext.publishName, ext.githubSlug, ext.developers; task pluginZip
*/
apply plugin: 'maven-publish'
apply plugin: 'signing'

publishing {
publications {
mavenZip(MavenPublication) {
groupId = project.group.toString()
artifactId = 'py-winrm-plugin'
version = project.version.toString()

artifact(tasks.named('pluginZip')) {
extension = 'jar'
}

pom {
packaging = 'jar'
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.
3 changes: 1 addition & 2 deletions gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
#Tue Dec 05 14:39:55 CLST 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-all.zip
Loading
Loading