Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
7 changes: 6 additions & 1 deletion Jenkinsfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
#!/usr/bin/env groovy

/* `buildPlugin` step provided by: https://github.com/jenkins-infra/pipeline-library */
buildPlugin()
buildPlugin(
useContainerAgent: true,
configurations: [
[platform: 'linux', jdk: 21],
[platform: 'windows', jdk: 17],
])
19 changes: 13 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,21 @@
ssh-plugin
===========
# ssh-plugin

You can use the SSH Plugin to run shell commands on a remote machine via ssh.
## About

This is a Jenkins plugin that allows for you to run operations with SSH. (I.e. commands, file management etc)

## Usage Documentation and Examples

More documentation available on the Jenkins wiki:

https://wiki.jenkins-ci.org/display/JENKINS/SSH+Plugin

Contribute
------------
## Building this project

Fork and send a pull request (or create an issue on GitHub or in JIRA)
```shell
mvn install
```

## Contribute

Fork and send a pull request (or create an issue on GitHub or in JIRA)
175 changes: 94 additions & 81 deletions pom.xml
Original file line number Diff line number Diff line change
@@ -1,94 +1,107 @@
<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>
<description>Execute shell scripts on remote host
using ssh (pre and post build).
Based on the cool scp plugin.</description>
<parent>
<groupId>org.jenkins-ci.plugins</groupId>
<artifactId>plugin</artifactId>
<version>1.609.3</version>
</parent>
<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>
<description>Execute shell scripts on remote host
using ssh (pre and post build).
Based on the cool scp plugin.
</description>
<parent>
<groupId>org.jenkins-ci.plugins</groupId>
<artifactId>plugin</artifactId>
<version>4.86</version>
<relativePath />
</parent>
<properties>
<jenkins.version>2.426.3</jenkins.version>
</properties>
<artifactId>ssh</artifactId>
<name>Jenkins SSH plugin</name>
<version>2.7-SNAPSHOT</version>
<packaging>hpi</packaging>
<url>http://wiki.jenkins-ci.org/display/JENKINS/SSH+plugin</url>

<artifactId>ssh</artifactId>
<name>Jenkins SSH plugin</name>
<version>2.7-SNAPSHOT</version>
<packaging>hpi</packaging>
<url>http://wiki.jenkins-ci.org/display/JENKINS/SSH+plugin</url>
<developers>
<developer>
<id>edmund_wagner</id>
<name>Edmund Wagner</name>
</developer>
<developer>
<id>ljader</id>
<name>Lukasz Jader</name>
</developer>
</developers>

<developers>
<developer>
<id>edmund_wagner</id>
<name>Edmund Wagner</name>
</developer>
<developer>
<id>ljader</id>
<name>Lukasz Jader</name>
</developer>
</developers>

<dependencies>
<dependency>
<groupId>org.jenkins-ci.plugins</groupId>
<artifactId>jsch</artifactId>
<version>0.1.54.1</version>
</dependency>
<dependencies>
<dependency>
<groupId>org.jenkins-ci.plugins</groupId>
<artifactId>jsch</artifactId>
</dependency>
<dependency>
<groupId>org.jenkins-ci.plugins</groupId>
<artifactId>ssh-credentials</artifactId>
<version>1.12</version>
</dependency>
</dependencies>
</dependencies>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.jenkins.tools.bom</groupId>
<artifactId>bom-2.426.x</artifactId>
<version>3208.vb_21177d4b_cd9</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>

<build>
<plugins>
<plugin>
<artifactId>maven-release-plugin</artifactId>
<configuration>
<goals>deploy</goals>
</configuration>
</plugin>
<plugin>
<groupId>org.jenkins-ci.tools</groupId>
<artifactId>maven-hpi-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<compatibleSinceVersion>2.5</compatibleSinceVersion>
</configuration>
</plugin>
</plugins>
</build>
<build>
<plugins>
<plugin>
<artifactId>maven-release-plugin</artifactId>
<configuration>
<goals>deploy</goals>
</configuration>
</plugin>
<plugin>
<groupId>org.jenkins-ci.tools</groupId>
<artifactId>maven-hpi-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<compatibleSinceVersion>2.5</compatibleSinceVersion>
</configuration>
</plugin>
</plugins>
</build>

<distributionManagement>
<repository>
<id>maven.jenkins-ci.org</id>
<url>https://repo.jenkins-ci.org/releases/</url>
</repository>
<snapshotRepository>
<id>maven.jenkins-ci.org</id>
<url>https://repo.jenkins-ci.org/snapshots/</url>
</snapshotRepository>
</distributionManagement>
<distributionManagement>
<repository>
<id>maven.jenkins-ci.org</id>
<url>https://repo.jenkins-ci.org/releases/</url>
</repository>
<snapshotRepository>
<id>maven.jenkins-ci.org</id>
<url>https://repo.jenkins-ci.org/snapshots/</url>
</snapshotRepository>
</distributionManagement>

<!-- get every artifact through maven.glassfish.org, which proxies all the
artifacts that we need -->
<repositories>
<repository>
<id>repo.jenkins-ci.org</id>
<url>https://repo.jenkins-ci.org/public/</url>
</repository>
</repositories>
<repositories>
<repository>
<id>repo.jenkins-ci.org</id>
<url>https://repo.jenkins-ci.org/public/</url>
</repository>
</repositories>

<pluginRepositories>
<pluginRepository>
<id>repo.jenkins-ci.org</id>
<url>https://repo.jenkins-ci.org/public/</url>
</pluginRepository>
</pluginRepositories>
<pluginRepositories>
<pluginRepository>
<id>repo.jenkins-ci.org</id>
<url>https://repo.jenkins-ci.org/releases/</url>
</pluginRepository>
</pluginRepositories>

<scm>
<connection>scm:git:git@github.com:jenkinsci/ssh-plugin.git</connection>
<developerConnection>scm:git:git@github.com:jenkinsci/ssh-plugin.git</developerConnection>
<tag>HEAD</tag>
</scm>
<scm>
<connection>scm:git:https://github.com/jenkinsci/ssh-plugin.git</connection>
<developerConnection>scm:git:git@github.com:jenkinsci/ssh-plugin.git</developerConnection>
<tag>HEAD</tag>
</scm>

</project>
3 changes: 3 additions & 0 deletions src/main/java/org/jvnet/hudson/plugins/SSHBuildWrapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
import com.cloudbees.plugins.credentials.CredentialsProvider;
import com.cloudbees.plugins.credentials.common.StandardUsernameCredentials;
import com.jcraft.jsch.JSchException;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;

public final class SSHBuildWrapper extends BuildWrapper {

Expand Down Expand Up @@ -211,6 +212,8 @@ public String getHelpFile() {
}

@Override
@SuppressFBWarnings(value = "NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE",
justification = "Javadoc promises req is always non-null")
public BuildWrapper newInstance(StaplerRequest req, JSONObject formData) {
return req.bindJSON(clazz, formData);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,10 @@ public static String preludeWithEnvVars(String originalCommand, Map<String, Stri
}
vars.remove("_"); //why _ as key for build tool?
StringBuilder sb = new StringBuilder();
for (String variable : vars.keySet()) {
for (Map.Entry<String, String> entry : vars.entrySet()) {
//TODO handle case sensitivity for command and each variable
if (originalCommand.contains(variable) ) {
sb.append(variable).append("=\"").append(vars.get(variable)).append("\"\n");
if (originalCommand.contains(entry.getKey()) ) {
sb.append(entry.getKey()).append("=\"").append(entry.getValue()).append("\"\n");
}
}
sb.append("\n");
Expand All @@ -36,9 +36,9 @@ public static String scrub(String command, Map<String, String> vars, Set<String>
}
vars.remove("_");
for (String sensitive : eyesOnlyVars) {
for (String variable : vars.keySet()) {
if (variable.equals(sensitive)) {
String value = vars.get(variable);
for (Map.Entry<String, String> entry : vars.entrySet()) {
if (entry.getKey().equals(sensitive)) {
String value = vars.get(entry.getKey());
//TODO handle case sensitivity for command and each value
if (command.contains(value)) {
if (command.contains("\"" + value + "\"")) {
Expand Down
1 change: 1 addition & 0 deletions src/main/resources/index.jelly
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
<?jelly escape-by-default='true'?>
<div>
This plugin executes shell commands remotely using SSH protocol.
</div>
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
<?jelly escape-by-default='true'?>
<j:jelly xmlns:j="jelly:core" xmlns:st="jelly:stapler" xmlns:d="jelly:define" xmlns:l="/lib/layout" xmlns:t="/lib/hudson" xmlns:f="/lib/form">

<j:set var="helpURL" value="/plugin/ssh" />
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
<?jelly escape-by-default='true'?>
<j:jelly xmlns:j="jelly:core" xmlns:st="jelly:stapler" xmlns:d="jelly:define" xmlns:l="/lib/layout" xmlns:t="/lib/hudson" xmlns:f="/lib/form" xmlns:c="/lib/credentials">
<!-- nothing to configure -->
<f:section title="${%SSH remote hosts}">
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
<?jelly escape-by-default='true'?>
<j:jelly xmlns:j="jelly:core" xmlns:st="jelly:stapler" xmlns:d="jelly:define" xmlns:l="/lib/layout" xmlns:t="/lib/hudson" xmlns:f="/lib/form">

<f:entry title="${%SSH site}" field="siteName">
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,10 @@
<?xml version='1.0' encoding='UTF-8'?>
<hudson>
<version>1.609.3</version>
<version>2.320</version>
<numExecutors>1</numExecutors>
<mode>NORMAL</mode>
<useSecurity>true</useSecurity>
<authorizationStrategy class="hudson.security.ProjectMatrixAuthorizationStrategy">
<permission>hudson.model.Hudson.Read:anonymous</permission>
<permission>hudson.model.Item.Read:anonymous</permission>
</authorizationStrategy>
<authorizationStrategy class="hudson.security.AuthorizationStrategy$Unsecured"/>
<securityRealm class="hudson.security.LegacySecurityRealm"/>
<jdks/>
<slaves/>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,10 @@
<?xml version='1.0' encoding='UTF-8'?>
<hudson>
<version>1.609.3</version>
<version>2.320</version>
<numExecutors>1</numExecutors>
<mode>NORMAL</mode>
<useSecurity>true</useSecurity>
<authorizationStrategy class="hudson.security.ProjectMatrixAuthorizationStrategy">
<permission>hudson.model.Hudson.Read:anonymous</permission>
<permission>hudson.model.Item.Read:anonymous</permission>
</authorizationStrategy>
<authorizationStrategy class="hudson.security.AuthorizationStrategy$Unsecured"/>
<securityRealm class="hudson.security.LegacySecurityRealm"/>
<jdks/>
<slaves/>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,10 @@
<?xml version='1.0' encoding='UTF-8'?>
<hudson>
<version>1.609.3</version>
<version>2.320</version>
<numExecutors>1</numExecutors>
<mode>NORMAL</mode>
<useSecurity>true</useSecurity>
<authorizationStrategy class="hudson.security.ProjectMatrixAuthorizationStrategy">
<permission>hudson.model.Hudson.Read:anonymous</permission>
<permission>hudson.model.Item.Read:anonymous</permission>
</authorizationStrategy>
<authorizationStrategy class="hudson.security.AuthorizationStrategy$Unsecured"/>
<securityRealm class="hudson.security.LegacySecurityRealm"/>
<jdks/>
<slaves/>
Expand Down