2017-06-19 23 views
6

Tôi đã tạo tập lệnh PowerShell sẽ chuyển (sử dụng winscp.dll) các tệp từ máy chủ Windows Jenkins sang máy chủ Linux. Trong dòng lệnh Jenkins, tôi đã thực hiện kịch bản lệnh PowerShell đó và nó hoạt động tốt.Thực thi tập lệnh Batch không hoạt động trên Jenkins Pipeline Job

Nhưng khi tôi cố gắng tương tự trong công việc đường ống Jenkins, nó gọi tập lệnh PowerShell và đi đến bước tiếp theo. Nó không chờ đợi phản hồi kịch bản PowerShell.

bat 'powershell.exe -ExecutionPolicy Bypass "D:\\Test\\Deploymentscripts\\PowerShellScript\\FileTransfer.ps1 $env:EndMarket $env:Environment"' 

Tôi đã thử với một tập lệnh PowerShell khác sẽ kết nối với máy chủ Linux và thực thi một số lệnh. Nó hoạt động tốt trong công việc đường ống

Vui lòng hướng dẫn tôi khắc phục vấn đề này.

+1

Bạn cần giải quyết điều này từ bên trong tập lệnh PowerShell không được đưa ra trong câu hỏi của bạn. Có một ví dụ PowerShell/winscp.dll ở đây: https://winscp.net/eng/docs/library_powershell. Như trong ví dụ này, '$ session' được làm sạch (' $ session.Dispose() ') khi quá trình truyền thành công, bạn có thể giả định rằng quá trình truyền được thực hiện. – iRon

+0

Bạn có thể chia sẻ cấu hình đường ống của mình không? –

Trả lời

3

Thú vị. Vấn đề của bạn dường như không có trong kịch bản của bạn bởi vì bạn đã giải thích rằng nó hoạt động trong một công việc hàng loạt.

Tôi không biết cách viết đường ống của bạn, nhưng tôi khuyên bạn nên xem Stage, Lock and Milestone có lẽ là những gì bạn cần.

Bước sân khấu là một khối xây dựng cơ bản trong đường ống, chia bước của một đường ống thành các đơn vị rõ ràng và giúp đỡ để hình dung tiến bộ bằng cách sử dụng "Stage Xem" plugin

Tôi đoán bạn có thể thêm một khối sân khấu như thế này trong đường ống của bạn:

stage("Previous Step") { 

     // Some previous step 
    } 

stage("Wait for Script Execution") { 

    // Call your script 
    bat 'powershell.exe -ExecutionPolicy Bypass "D:\\Test\\Deploymentscripts\\PowerShellScript\\FileTransfer.ps1 $env:EndMarket $env:Environment"' 
} 

stage("Next Step") { 

     // Script already finished its execution 
    } 

Nhưng không có thông tin đường ống của bạn chỉ là phỏng đoán. Ngoài ra để cải thiện khả năng tương thích kịch bản của bạn tránh "dơi và ExcutionPolicy" và sử dụng PowerShell plugin, với plugin mà bạn có thể đơn giản hóa mã của bạn như thế này:

powershell -File your_script.ps1 

EDIT: tôi quên đề cập rằng bạn có thể thử một lựa chọn khác nhau để powershell và lib winscp sử dụng "scp" tương thích trực tiếp giữa Windows và Linux, tôi đang nói về Cygwin.

Với Cygwin cài đặt (với scp), bạn có thể sử dụng scp như nó đã được một hộp Linux và một kịch bản bash thay PowerShell:

D:/cygwin-64/bin/run.exe /usr/bin/bash -lic \"/home/user/file.sh\" 

Trong trường hợp này tôi đang chạy một kịch bản âm thầm thông qua Cygwin trong một Jenkins Dự án với tùy chọn "Chạy Windows Batch". Trong kịch bản lệnh, bạn có thể thêm các lệnh shell và các lệnh scp mà bạn muốn.

Điều này có vẻ phức tạp hơn một chút nhưng bổ sung thêm tính linh hoạt để thực hiện các tác vụ Windows - Linux.

Tôi đã nêu chi tiết ví dụ hơn trong số blog của mình, bạn có thể thấy nó hữu ích.

Như avvi đã đề cập, bạn nên kiểm tra xem các biến đó đang được tải hay chưa.

0

Bạn không gọi đúng tập lệnh. Bạn đang đi qua trong $ Env trong lời gọi powershell đó là một biến powershell.

Bạn đang ở chế độ hàng loạt vì vậy sẽ được chuyển trong%.

bat 'powershell.exe -ExecutionPolicy Bypass "D:\\Test\\Deploymentscripts\\PowerShellScript\\FileTransfer.ps1" "%EndMarket%" "%Environment%"' 
Các vấn đề liên quan