2016-11-01 26 views
3

TL; DR即使Jenkins在Windows上运行,我也想使用sh步骤。我不想用bat一步,除非你能告诉我如何轻松地再现什么,我需要使用bat在Windows上使用sh步骤

我一直在把一些老詹金斯作业2.X管道脚本来完成。我的一项工作使用“发布通过SSH插件”来:

  • 发送文物到远程服务器
  • Exec的一组命令的远程服务器

上。例如:

Publish over SSH plugin

我想在Pipeline Script中复制它,所以我做了以下操作:

stage('Deploy') { 
    withCredentials([[$class: 'FileBinding', credentialsId: 'bitbucket-key-file', variable: 'SSHKEY']]) { 
     sh ''' 
      scp -i "$SSHKEY" dsub.tar.gz [email protected]:dsubdeploy 
      scp -i "$SSHKEY" deployDsubUi.sh [email protected]:dsubdeploy 
      ssh -i "$SSHKEY" -o StrictHostKeyChecking=no 192.168.220.57 <<- EOF 
       DEPLOY_DIR=/home/tprmbbuild/dsubdeploy 
       echo '*** dos2unix using sed' 
       sed -e 's/\r$//' $DEPLOY_DIR/deployDsubUi.sh > $DEPLOY_DIR/deployDsubUi-new.sh 
       mv $DEPLOY_DIR/deployDsubUi-new.sh $DEPLOY_DIR/deployDsubUi.sh 
       chmod 755 $DEPLOY_DIR/deployDsubUi.sh 
       echo '*** Deploying Dsub UI' 
       $DEPLOY_DIR/deployDsubUi.sh $DEPLOY_DIR/dsub.tar.gz 
      EOF''' 
    } 
    } 

问题是,我执行我的体型时,得到这个堆栈跟踪:

[Pipeline] sh 
[E:\Jenkins\jenkins_home\workspace\[email protected]] Running shell script 
     1 [main] sh 3588 E:\Jenkins\tools\Git_2.10.1\usr\bin\sh.exe: *** fatal error - add_item ("\??\E:\Jenkins\tools\Git_2.10.1", "/", ...) failed, errno 1 
Stack trace: 
Frame  Function Args 
000FFFF9BB0 0018005C24E (0018023F612, 0018021CC39, 000FFFF9BB0, 000FFFF8B30) 
000FFFF9BB0 001800464B9 (000FFFFABEE, 000FFFF9BB0, 1D2345683BEC046, 00000000000) 
000FFFF9BB0 001800464F2 (000FFFF9BB0, 00000000001, 000FFFF9BB0, 4A5C3A455C3F3F5C) 
000FFFF9BB0 001800CAA8B (00000000000, 000FFFFCE00, 001800BA558, 1D234568CAFA549) 
000FFFFCC00 00180118745 (00000000000, 00000000000, 001800B2C5E, 00000000000) 
000FFFFCCC0 00180046AE5 (00000000000, 00000000000, 00000000000, 00000000000) 
00000000000 00180045753 (00000000000, 00000000000, 00000000000, 00000000000) 
000FFFFFFF0 00180045804 (00000000000, 00000000000, 00000000000, 00000000000) 
End of stack trace 
+0

这与你有关吗? http://www.tikalk.com/devops/shell-jenkins-windows-slave/ –

+0

输出不显示'“*** dos2unix使用sed”'。它可能在'scp'中失败了,或者它可能在启动shell时失败。如果你可以在每个scp之后加上'echo'命令,那可能会给你一个提示。你也可以尝试运行一个空的shell脚本(只用'echo')来缩小问题的范围。 – blackpen

+0

@blackpen实际上这是我的信念,它是无法产卵的shell,所以没有一个命令有机会运行 – ThaDon

回答

1

您应该能够直接在批处理脚本中从git安装运行scp.exe。 就我所知,批处理没有“here”文档,但是您可以将脚本在服务器上运行到单独的文件中。

(未经测试)

stage('Deploy') { 
withCredentials([[$class: 'FileBinding', credentialsId: 'bitbucket-key-file', variable: 'SSHKEY']]) { 
    bat ''' 
     E:\\Jenkins\\tools\\Git_2.10.1\\usr\\bin\\scp.exe -i "${SSHKEY}" dsub.tar.gz [email protected]:dsubdeploy 
     E:\\Jenkins\\tools\\Git_2.10.1\\usr\\bin\\scp.exe -i "${SSHKEY}" deployDsubUi.sh [email protected]:dsubdeploy 
     E:\\Jenkins\\tools\\Git_2.10.1\\usr\\bin\\scp.exe -i "${SSHKEY}" -o StrictHostKeyChecking=no 192.168.220.57 < server_script.sh 
} 

}

+1

我很失望,虽然我可以用v1.6插件很容易做的事情很复杂,甚至不可能用2.x管道脚本 – ThaDon

3

同意“这是我的信念,它是无法产卵壳”。它试图运行“E:\ Jenkins \ tools \ Git_2.10.1 \ usr \ bin \ sh.exe”(使用Windows反斜杠语法)。除非我们在提到的目录中配置了一个shell可执行文件(sh.exe),否则它将失败。

Powershell的(或运行cmd shell):
如果您oepn使用批处理文件,则必须安装/配置3个二进制文件(SSH,SCP,SSH)。其他一切都落在了地方(我看到你正在使用ssh向远程机器发送命令,我假定远程服务器是基于linux/unix的)。

替代
您可以使用VirtualBox上的cygwin或运行Linux(或模仿在Windows Linux的任何软件)。但是,只运行3个命令可能不值得麻烦(如果您有计划在将来转换/编写更多的shell脚本,这将非常有用。

+0

@ThaDon,感谢奖励赏金。你需要澄清,我会很乐意帮助你 – blackpen

1

可以使用的,而不是在Windows中 “sh” 的 “蝙蝠”。 还使用2个反斜杠正确地转义路径字符串。看下面的例子

node { 
     currentBuild.result = "SUCCESS" 
     try { 

     stage('Checkout'){ 

      checkout scm 
     } 

     stage('Convert to Binary RPD'){ 
     bat "D:\\oracle\\Middleware\\user_projects\\domains\\bi\\bitools\\bin\\biserverxmlexec -D .\\RPD -P Gl081Reporting -O .\\GLOBI.rpd" 
     } 


     stage('Notify'){ 

     echo 'sending email' 

     // send to email 
      emailext ( 
       subject: "SUCCESS: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]'", 
       body: """$PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS: 
        Check console output at $BUILD_URL to view the results.""", 
       to:"[email protected] [email protected]" 
      ) 
     } 

    } 
    catch (err) { 

     currentBuild.result = "FAILURE" 

     throw err 
    } 

}