【问题标题】:Docker Jenkins Blue Ocean can not run ssh scp in PipelineDocker Jenkins Blue Ocean 无法在 Pipeline 中运行 ssh scp
【发布时间】:2018-11-14 18:09:56
【问题描述】:

我已经根据 jenkins 的指令构建了一个 Jenkins docker,如下所示:

docker run -u root --rm -d -p 8080:8080 -p 50000:50000 -v /root/.ssh/id_rsa:/root/.ssh/id_rsa -v jenkins-home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock jenkinsci/blueocean

它按我的预期工作。

然后我设置了一个新的流水线作业,Jenkinsfile 简单如下:

pipeline {
agent {
    docker {
        image 'maven:3-alpine'
        args '-v /root/.m2:/root/.m2'
    }
}
stages {
    stage('Build') {
        steps {
            sh 'mvn -B -DskipTests clean package'
        }
    }
    stage('Test') {
        steps {
            echo "Testing!"
        }

    } 
    stage('Deploy') {
        steps {
            sh "ssh docker@192.168.99.101 rm -rf /home/docker/wildfly_deployments/*" 
            sh "scp target/test-docker-app-1.0.war docker@192.168.99.101:/home/docker/wildfly_deployments/"
        }

    } 
}
}

当我运行此作业时,在“部署”阶段,它会显示此错误消息

[test-docker-app] Running shell script
+ ssh docker@192.168.99.101 rm -rf /home/docker/wildfly_deployments/*
/var/jenkins_home/workspace/test-docker-app@tmp/durable-4cd12dd8/script.sh: line 1: ssh: not found
script returned exit code 127

我确信 Jenkins 容器可以执行 ssh 和 scp,因为我尝试在 Jenkins 容器中运行相同的命令,我工作了。

你知道我在 Jenkinsfile 中有什么问题吗?请帮忙

谢谢。

=================================

我在 jenkinsfile 中发现了问题,应该是:

pipeline {
    agent any
    stages {
        stage('Build') {
            agent {
                docker {
                    image 'maven:3-alpine'
                    args '-v m2_repos:/root/.m2'
                }
            }
            steps {
                sh 'mvn -B -DskipTests clean package'
            }
        }
        stage('Test') {
            steps {
                echo "Testing!"
            }

        } 
        stage('Deploy') {
            steps {
                sh "ssh docker@192.168.99.101 rm -rf /home/docker/wildfly_deployments/*" 
                sh "scp target/test-docker-app-1.0.war docker@192.168.99.101:/home/docker/wildfly_deployments/"
                /*sh 'bash ./deploy.sh'*/
            }

        } 
    }
}

【问题讨论】:

  • 尝试手动 ssh 到 docker 容器,which ssh 应该是绝对路径。例如 ; /path/to/ssh
  • 可以为jenkins配置shell stackoverflow.com/questions/12455932/…
  • @ThanhNguyenVan 感谢您的快速响应,但它不起作用。

标签: docker jenkins ssh jenkins-pipeline scp


【解决方案1】:

对我来说,理解的关键是名为“Master”的 Build-Executor 是 blueocean jenkinsci FROM jenkinsci/blueocean image 的运行时“Agent”上下文

在 Jenkinsfile 中,agent { label 'master' } 表示在 Master 上运行步骤,agent { label 'Dockerfile' } 表示在项目 docker 容器中运行步骤。

您需要一个多代理管道,因此从agent none 开始,并在每个阶段添加一个代理,以针对其代理环境。在这种情况下 agent { label 'master' }jenkinsci/blueocean 容器运行 ssh

太明显了,任何人都无法解释......!

您将需要 SSH 代理插件来创建凭据,并复制私有 ssh 密钥。它会给你一个 ID 用于你的 Jenkinsfile DSL 脚本

pipeline {
  agent none

  stages {
    stage('Hello Docker') {
      agent { dockerfile {filename 'Dockerfile'}}
      steps {
        echo 'Hello Docker'
      }
    }

 stage('Make useful SSH connections') {  
      agent { label 'master' }
        steps{

             //Your in the in Master Container
             sh 'hostname'

             //In this working directory
             sh 'pwd'

             //You provide SSH credentails via the SSHagent 
             sshagent(credentials : ['<ID OF THE SSH AGENT CREDENTIAL>']) {

             //Connect to hostip/s with ssh, run scripts, go wild!
             sh 'ssh -o StrictHostKeyChecking=no user@hostip uptime'


             //and SCP 
             sh 'scp ./source/filename user@hostip:/remotehost/target 
            }
      }
}

Jenkins 节点由代理标签控制,酷 :)

【讨论】:

  • 这个解决方案工作正常,我不知道为什么它没有投票:)
猜你喜欢
  • 2019-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-12
  • 2019-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多