Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use publish over ssh plugin in pipeline

I would like to SSH to linux server from Jenkins hosted on windows and execute a command over in linux machine, I tried installing publish over ssh plugin and tested the connection in global config and it works fine, I don't know how to proceed next in pipeline. Any help would be appreciated.

like image 271
Chris Avatar asked Feb 14 '18 11:02

Chris


People also ask

How to use publish over SSH plugin in Jenkins?

It’s possible to use Publish Over SSH Plugin. Lets set up ssh connection details in the settings interface of Jenkins. We assign server a name, an address, user’s name and authorization way — by password, passphrase or an indicate key. These adjustments are simple and easy. You may found more details on plugin’s page.

What are the options for publish over SSH?

Only options specific to Publish over SSH are documented below. Execute commands on a remote server (can be disabled for a server configuration, or for the whole plugin) Use username and password (keyboard-interactive) or public key authentication Passwords/passphrases are encrypted in the configuration files and in the UI

What is the SSH steps plugin?

The initial version of this new plugin SSH Steps supports the following: sshCommand: Executes the given command on a remote node. sshScript: Executes the given shell script on a remote node. sshGet: Gets a file/directory from the remote node to current workspace.

Are there any plugins that integrate with pipeline-compatible steps?

The following plugin provides functionality available through Pipeline-compatible steps. Read more about how to integrate steps into your Pipeline in the Steps section of the Pipeline Syntax page. For a list of other such plugins, see the Pipeline Steps Reference page.


3 Answers

If you are using a pipeline project and a Jenkinsfile, then all you need to do is go into your project in Jenkins and click configure. In the pipeline section of the configuration, at the bottom there is a link "pipeline syntax". It will take you to the Snippet Generator. Its self explanatory and in our case it allows to generate "publish over ssh" snippets that you would add to your Jenkinsfile (add it to a steps section inside a stage definition). In the generator you can define what to publish, options to run a shell command, etc. source

like image 129
J Selecta Avatar answered Oct 19 '22 23:10

J Selecta


In case you were looking for the syntax for a declarative pipeline (Jenkinsfile) for Publish-Over-SSH, (Instead of the scripted pipeline, which is all I could find). Here's what finally worked for me.

pipeline{
  agent any
  environment {
    RELEASENAME="yourProject-ci"
  }
  stages{
    stage("Get the charts..."){
        steps {checkout scm}
    }
    stage('SSH transfer') {
        steps([$class: 'BapSshPromotionPublisherPlugin']) {
            sshPublisher(
                continueOnError: false, failOnError: true,
                publishers: [
                    sshPublisherDesc(
                        configName: "kubernetes_master",
                        verbose: true,
                        transfers: [
                            sshTransfer(execCommand: "/bin/rm -rf /opt/deploy/helm"),
                            sshTransfer(sourceFiles: "helm/**",)
                        ]
                    )
                ]
            )
        }
    }
    stage('Deploy Helm Scripts'){
        steps([$class: 'BapSshPromotionPublisherPlugin']) {
            sshPublisher(
                continueOnError: false, failOnError: true,
                publishers: [
                    sshPublisherDesc(
                        configName: "kubernetes_master",
                        verbose: true,
                        transfers: [
                            sshTransfer(execCommand: "cd /opt/deploy/helm;helm upgrade ${RELEASENAME} . --install"),
                        ]
                    )
                ]
            )
        }
    }
  }
}

I have a checkout that happens first and then I copy some helm charts from the checkout to my kubernetes master and then run the charts.

configName: "kubernetes_master" is something I setup in the Publish_over_ssh plugin configuration section (Found under Manage Jenkins > Configure System) so I could reference it. It includes a username, sshkey, destination hostname, and base directory for the destination which I put as /opt/deploy.

FYI execCommand does not use the base directory... it assumes you will use full pathing.

Hope that helps.

edit: I should probably mention that there are lots more options for the sshPublisher than what I used. You can find them here: https://jenkins.io/doc/pipeline/steps/publish-over-ssh/

like image 34
Levi Silvertab Avatar answered Oct 19 '22 23:10

Levi Silvertab


Based on levis answer, the below has worked for me.

stage('Deploy') {
  agent any
  steps {
    sh 'mv target/my-app-0.0.1-SNAPSHOT.jar my-app.jar'
    sshPublisher(
      continueOnError: false, 
      failOnError: true,
      publishers: [
        sshPublisherDesc(
          configName: "my-ssh-connection",
          transfers: [sshTransfer(sourceFiles: 'my-app.jar')],
          verbose: true
        )
      ]
    )
  }
}
like image 40
The Fool Avatar answered Oct 19 '22 22:10

The Fool