Saya memiliki sesuatu seperti ini di Jenkinsfile (Groovy) dan saya ingin merekam stdout dan kode keluar dalam sebuah variabel untuk menggunakan informasi nanti.
sh "ls -l"
Bagaimana saya bisa melakukan ini, terutama karena tampaknya Anda tidak dapat benar-benar menjalankan segala jenis kode asyik di dalam Jenkinsfile
?
Jawaban:
Versi terbaru dari
sh
langkah pipeline memungkinkan Anda untuk melakukan hal berikut;Fitur lainnya adalah
returnStatus
opsi.Opsi-opsi ini ditambahkan berdasarkan masalah ini .
Lihat dokumentasi resmi untuk
sh
perintah tersebut.sumber
WorkflowScript: 97: Expected a step @ line 97, column 17.
script
blok langkah. jenkins.io/doc/book/pipeline/syntax/#declarative-stepsVersi Pipeline saat ini secara native mendukung
returnStdout
danreturnStatus
, yang memungkinkan untuk mendapatkan output atau status darish
/bat
langkah-langkah.Sebuah contoh:
Dokumentasi resmi .
sumber
script { }
langkah.jawaban cepatnya adalah ini:
Saya pikir ada permintaan fitur untuk bisa mendapatkan hasil dari langkah sh, tetapi sejauh yang saya tahu, saat ini tidak ada pilihan lain.
EDIT: JENKINS-26133
EDIT2: Tidak yakin sejak versi apa, tetapi langkah sh / bat sekarang dapat mengembalikan output std, cukup:
sumber
Jika Anda ingin mendapatkan stdout DAN tahu apakah perintahnya berhasil atau tidak, gunakan saja
returnStdout
dan bungkuslah dengan penangan pengecualian:pipa scripted
keluaran :
Sayangnya hudson.AbortException tidak memiliki metode yang berguna untuk mendapatkan status keluar itu, jadi jika nilai aktual diperlukan Anda harus menguraikannya keluar dari pesan (ugh!)
Bertentangan dengan Javadoc https://javadoc.jenkins-ci.org/hudson/AbortException.html build tersebut adalah tidak gagal ketika pengecualian ini ditangkap. Gagal saat tidak tertangkap!
Memperbarui: Jika Anda juga ingin keluaran STDERR dari perintah shell, Jenkins sayangnya gagal untuk mendukung kasus penggunaan umum dengan benar. Tiket 2017 JENKINS-44930 macet dalam kondisi ping-pong yang beralasan sementara tidak membuat kemajuan menuju solusi - harap pertimbangkan untuk menambahkan suara Anda ke dalamnya.
Sebagai solusi sekarang , mungkin ada beberapa pendekatan yang mungkin:
a) Redirect STDERR ke STDOUT
2>&1
- tetapi terserah Anda untuk menguraikannya dari output utama, dan Anda tidak akan mendapatkan output jika perintah gagal - karena Anda berada di handler pengecualian.b) redirect STDERR ke file sementara (nama yang Anda persiapkan sebelumnya)
2>filename
(tapi ingat untuk membersihkan file sesudahnya) - yaitu. kode utama menjadi:c) Pergi ke arah lain, atur
returnStatus=true
sebagai gantinya, membuang pengecualian handler dan selalu menangkap output ke file, yaitu:Peringatan: kode di atas adalah khusus Unix / Linux - Windows memerlukan perintah shell yang sama sekali berbeda.
sumber
ini adalah contoh kasus, yang akan masuk akal saya percaya!
sumber
Bagi mereka yang perlu menggunakan output dalam perintah shell berikutnya, daripada asyik, sesuatu seperti contoh ini bisa dilakukan:
Saya menemukan contoh pada kode pakar cukup berguna.
sumber
Cara termudah adalah menggunakan cara ini
my_var=`echo 2` echo $my_var
output: 2Catatan yang tidak sederhana adalah kutipan tunggal adalah back quote (`).
sumber
sh
lain orang mungkin berpikir itu asyik, terutama jika mereka tidak terbiasa dengan bash scripting. Saya baru saja mencobanya di Jenkins, menggunakanls -l
bukanecho 2
dan itu berhasil. Saya sebenarnya telah menggunakan pendekatan ini sebelumnya, tetapi telah mencari alternatif karena, itu tidak terlalu dapat diandalkan. Saya memiliki output dari perintah yang lebih kompleks ditangkap pada shell standar dengan cara ini, tetapi ketika porting ke Jenkinssh
variabel tidak memiliki apa-apa, untuk beberapa alasan yang tidak diketahui.