2016-11-01 28 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 
    } 

}