Sebagai bagian dari proses build saya, saya menjalankan git commit sebagai langkah eksekusi shell. Namun, jika tidak ada perubahan di ruang kerja, Jenkins gagal membangun. Ini karena git mengembalikan kode kesalahan ketika tidak ada perubahan untuk dikomit. Saya ingin membatalkan pembangunan, atau hanya menandainya tidak stabil jika ini masalahnya. Ada ide?
132
Jawaban:
Untuk menghentikan eksekusi lebih lanjut ketika perintah gagal:
command || exit 0
Untuk melanjutkan eksekusi ketika perintah gagal:
command || true
sumber
|| exit 0
dalam kasus pertama, jikacommand
pengembalian palsu eksekusi akan berhenti. Yang mengatakan, opsi kedua sangat membantu!exit 0
karena kode keluar yang tidak nol akan gagal membangun.Jenkins menjalankan langkah-langkah membangun shell menggunakan
/bin/sh -xe
secara default.-x
artinya mencetak setiap perintah yang dieksekusi.-e
berarti keluar dengan gagal jika ada perintah dalam skrip yang gagal.Jadi saya pikir apa yang terjadi dalam kasus Anda adalah perintah git Anda keluar dengan 1, dan karena
-e
param default , shell mengambil kode keluar non-0, mengabaikan sisa skrip dan menandai langkah sebagai kegagalan. Kami dapat mengkonfirmasi ini jika Anda dapat memposting skrip langkah pembuatan Anda di sini.Jika itu masalahnya, Anda dapat mencoba untuk meletakkan
#!/bin/sh
sehingga skrip akan dieksekusi tanpa opsi; atau melakukanset +e
hal serupa di atas langkah build untuk mengesampingkan perilaku ini.Diedit: Hal lain yang perlu diperhatikan adalah bahwa, jika perintah terakhir dalam skrip shell Anda mengembalikan kode non-0 , seluruh langkah build akan tetap ditandai sebagai gagal walaupun dengan pengaturan ini. Dalam hal ini, Anda bisa meletakkan
echo
perintah di bagian akhir untuk menghindari itu.Pertanyaan terkait lainnya
sumber
Jika tidak ada yang mendorong git mengembalikan status keluar 1. Eksekusi langkah build shell ditandai sebagai gagal masing-masing. Anda dapat menggunakan ATAU pernyataan || (pipa ganda).
Itu berarti, jalankan argumen kedua jika pertama gagal (status keluar kembali> 0). Perintah kedua selalu kembali 0. Ketika tidak ada yang mendorong (status keluar 1 -> jalankan perintah kedua) gema akan kembali 0 dan membangun langkah berlanjut.
Untuk menandai build sebagai tidak stabil, Anda dapat menggunakan langkah post-build Jenkins Text Finder. Itu bisa melalui keluaran konsol, pola kecocokan (gema Anda) dan tandai bangunan tidak stabil.
sumber
Ada cara lain yang mulus untuk memberi tahu Jenkins agar tidak gagal. Anda dapat mengisolasi komit Anda dalam langkah build dan mengatur shell agar tidak gagal:
sumber
set -e
setelah perintah yang ingin Anda jalankan terlepas dari kode keluar. Jika tidak, Anda bisa menjalankan perintah yang tidak Anda inginkan. Saya ingin menangani kesalahan sendiri, jadi saya melakukan sesuatu seperti: `set + e commit -m" bla "EXIT_CODE =" $ {?} "Set -e # handle logika kodeJenkins menentukan keberhasilan / kegagalan langkah demi langkah mengembalikan nilai langkah tersebut. Untuk kasus shell, itu harus menjadi pengembalian nilai terakhir. Untuk shell Bash Windows CMD dan (POSIX), Anda harus dapat mengatur nilai kembali secara manual dengan menggunakan
exit 0
sebagai perintah terakhir.sumber
exit 0
dengan "jalankan perintah batch windows" dalam beberapa build di instal Windows Jenkins saya, dan berfungsi seperti yang diharapkan. Sesuatu yang lain pasti sedang terjadi. Bisakah Anda memposting bagian yang relevan dari log konsol?#!/bin/sh -xv
yang mengakibatkan menghentikan skrip jika ada kesalahan ditemukan.Saya dapat mengaktifkannya menggunakan jawaban yang ditemukan di sini:
Bagaimana cara git tidak melakukan apa-apa tanpa kesalahan?
sumber
git diff
perintah, dan jika itu gagal, lakukangit commit
perintah. Pada dasarnya, hanya melakukan komit, jikagit diff
menemukan sesuatu untuk dikomit. Namun, jawaban @jwernerny benar bahwa Anda harus dapat menambahkanexit 0
pernyataan terakhir ke skrip apa pun untuk membuat Jenkins memperlakukannya sebagai sukses. Saya bisa memikirkan satu skenario di mana ini akan gagal jika Anda melakukan langkah shell Linux, tetapi dalam Batch ini harus selalu bekerja./bin/sh -xe
secara default seperti yang disebutkan di sini (di tengah). Jadi Anda dapat mencoba meletakkan#!/bin/bash
atau melakukan langkahset +e
di atas langkah build untuk menimpa perilaku ini, yang akan melanjutkan sisa langkah bahkan satu perintah di dalam keluar dengan kode non-0Pada pertanyaan (lebih umum) dalam judul - untuk mencegah Jenkins gagal, Anda dapat mencegahnya melihat kode keluar 1. Contoh untuk ping:
Dan sekarang Anda bisa mis. Mendapatkan hasil ping:
Tentu saja alih-alih
ping ...
Anda dapat menggunakan perintah apa pun - termasukgit commit
.sumber
https://jenkins.io/doc/pipeline/steps/workflow-durable-task-step/#sh-shell-script
jika Anda menyertakan properti returnStatus: true, maka pengembalian shell diabaikan.
sumber
Anda dapat menggunakan Plugin Text-finder . Ini akan memungkinkan Anda untuk memeriksa konsol keluaran untuk ekspresi pilihan Anda lalu tandai build as
Unstable
.sumber
Untuk beberapa perintah shell, saya mengabaikan kegagalan dengan menambahkan:
set +e commands true
sumber
Jika Anda menempatkan perintah ini ke dalam blok shell:
build Anda akan ditandai sebagai gagal (setidaknya 1 kode keluar bukan nol), sehingga Anda dapat menambahkan (set + e) untuk mengabaikannya:
tidak akan gagal. Namun, ini akan gagal bahkan dengan (set + e) di tempat:
karena perintah shell terakhir harus keluar dengan 0.
sumber
Berikut ini berfungsi untuk lincah dengan hanya melakukan jika ada perubahan. Jadi build hanya gagal jika komit gagal.
sumber
Satu lagi jawaban dengan beberapa tips, dapat bermanfaat bagi seseorang:
ingatlah untuk memisahkan perintah Anda dengan aturan berikut :
command1 && command2 - artinya, perintah2 itu akan dieksekusi, hanya jika command1 berhasil
command1 ;command2 - artinya, perintah 2 itu akan dieksekusi meskipun berdasarkan perintah1
sebagai contoh:
akan dieksekusi dengan
set -e
danecho 0
perintah berhasil jikagmake test
gagal (tes Anda gagal), sementara kode berikut dipotong:sedikit salah dan perintah
set -e
danecho 0
di&& gmake test && set -e && echo 0
akan dilewati, denganprintln run_tests
pernyataan, karena gagalgmake test
akan membatalkan jenkins membangun. Sebagai solusi Anda dapat beralih kereturnStatus:true
, tetapi kemudian Anda akan kehilangan output dari perintah Anda.sumber
Jawaban ini benar, tetapi tidak menentukan
|| exit 0
atau|| true
masuk ke dalam perintah shell . Berikut ini contoh yang lebih lengkap:Di atas akan berfungsi, tetapi yang berikut akan gagal:
Mungkin sudah jelas bagi orang lain, tetapi saya membuang banyak waktu sebelum saya menyadari hal ini.
sumber