Hal pertama yang pertama, arahkan mouse ke area abu-abu di bawah. Bukan bagian dari jawaban, tetapi mutlak harus dijawab:
Jika Anda memiliki skrip shell yang melakukan "checkout, build, deploy" dengan sendirinya, lalu mengapa Anda menggunakan Jenkins? Anda mengabaikan semua fitur Jenkins yang menjadikannya seperti sekarang. Anda mungkin juga meminta cron atau hook pasca-komit SVN untuk memanggil skrip secara langsung. Jenkins yang melakukan pembayaran SVN sendiri sangatlah penting. Ini memungkinkan build untuk dipicu hanya jika ada perubahan (atau dengan timer, atau manual, jika Anda mau). Ini melacak perubahan di antara build. Ini menunjukkan perubahan tersebut, sehingga Anda dapat melihat build mana untuk kumpulan perubahan mana. Ini mengirim email kepada pelaku ketika perubahan mereka menyebabkan build yang berhasil atau gagal (sekali lagi, sesuai konfigurasi yang Anda inginkan). Ini akan mengirim email kepada pelaku ketika perbaikan mereka memperbaiki build yang gagal. Dan lebih banyak lagi. Jenkins yang mengarsipkan artefak juga membuatnya tersedia, per bangunan, langsung dari Jenkins. Meskipun tidak sepenting checkout SVN, ini sekali lagi merupakan bagian integral dari apa yang menjadikannya Jenkins. Sama dengan penerapan. Kecuali Anda memiliki satu lingkungan, penerapan biasanya terjadi pada beberapa lingkungan. Jenkins dapat melacak lingkungan mana yang dibuat oleh build tertentu (dengan kumpulan perubahan SVN tertentu) yang diterapkan, melalui penggunaan Promosi. Anda meninggalkan semua ini. Kedengarannya seperti Anda diberitahu "Anda harus menggunakan Jenkins" tetapi Anda tidak benar-benar menginginkannya, dan Anda melakukannya hanya untuk melepaskan bos Anda, hanya untuk memberi tanda centang "ya, saya telah menggunakan Jenkins"
Jawaban singkatnya adalah: kode keluar dari perintah terakhir dari langkah build Execute Shell Jenkin adalah yang menentukan keberhasilan / kegagalan Langkah Build . 0
- sukses, anything else
- kegagalan. Catatan, ini menentukan keberhasilan / kegagalan langkah build , bukan seluruh pekerjaan yang dijalankan . Keberhasilan / kegagalan dari seluruh pekerjaan yang dijalankan selanjutnya dapat dipengaruhi oleh beberapa langkah build, serta tindakan dan plugin pasca-build.
Anda telah menyebutkan Build step 'Execute shell' marked build as failure
, jadi kami akan fokus hanya pada satu langkah pembuatan. Jika langkah Execute shell build Anda hanya memiliki satu baris yang memanggil skrip shell Anda, kode keluar dari skrip shell Anda akan menentukan keberhasilan / kegagalan langkah build. Jika Anda memiliki lebih banyak baris, setelah eksekusi skrip shell, tinjau dengan cermat, karena baris itulah yang dapat menyebabkan kegagalan.
Terakhir, baca di sini Skrip Build Jenkins keluar setelah Google Test dijalankan . Ini tidak terkait langsung dengan pertanyaan Anda, tetapi perhatikan bahwa bagian tentang Jenkins yang meluncurkan langkah build Execute Shell , sebagai skrip shell dengan/bin/sh -xe
The -e
berarti bahwa script shell akan keluar dengan kegagalan, bahkan jika hanya 1 perintah gagal, bahkan jika Anda melakukan pengecekan error untuk perintah itu (karena keluar naskah sebelum sampai ke pengecekan error Anda). Ini bertentangan dengan eksekusi normal skrip shell, yang biasanya mencetak pesan kesalahan untuk perintah yang gagal (atau mengalihkannya ke null dan menanganinya dengan cara lain), dan lanjutkan.
Untuk menghindari ini, tambahkan set +e
ke bagian atas skrip shell Anda.
Karena Anda mengatakan skrip Anda melakukan semua yang seharusnya dilakukan, kemungkinan besar perintah yang gagal ada di suatu tempat di akhir skrip. Mungkin gema terakhir? Atau salinan artefak di suatu tempat? Tanpa melihat keluaran konsol secara lengkap, kami hanya menebak-nebak.
Silakan posting keluaran konsol dari pekerjaan yang dijalankan, dan sebaiknya juga skrip shell itu sendiri, dan kemudian kami dapat memberi tahu Anda dengan tepat baris mana yang gagal.
Jawaban sederhana dan singkat untuk pertanyaan Anda adalah
Harap tambahkan baris berikut ke dalam langkah Build "Execute shell" Anda.
Sekarang izinkan saya menjelaskan alasan mengapa kami memerlukan baris ini untuk pekerjaan build "Execute Shell".
Secara default, Jenkins take
/bin/sh -xe
dan ini berarti-x
akan mencetak setiap perintah. Dan opsi lainnya-e
, yang menyebabkan shell segera berhenti menjalankan skrip ketika ada perintah keluar dengan kode keluar bukan-nol (ketika ada perintah gagal).Jadi dengan menambahkan
#!/bin/sh
kehendak memungkinkan Anda untuk mengeksekusi tanpa opsi.sumber
find . -name 'bower_components' -exec rm {} \;
dan dalam beberapa kasus, gagal. Terima kasih!Menurut pendapat saya, mematikan
-e
opsi ke shell Anda adalah ide yang sangat buruk. Akhirnya salah satu perintah dalam skrip Anda akan gagal karena kondisi sementara seperti kehabisan ruang disk atau kesalahan jaringan. Tanpa-e
Jenkins tidak akan menyadarinya dan akan melanjutkan dengan bahagia. Jika Jenkins telah disiapkan untuk melakukan penerapan, hal itu dapat mengakibatkan kode yang buruk didorong dan menurunkan situs Anda.Jika Anda memiliki baris di skrip Anda di mana kegagalan diharapkan, seperti grep atau find, maka tambahkan saja
|| true
ke akhir baris itu. Itu memastikan bahwa garis itu akan selalu kembali sukses.Jika Anda perlu menggunakan kode keluar itu, Anda dapat memasukkan perintah ke dalam pernyataan if Anda:
Atau Anda dapat menangkap kode pengembalian dalam
||
klausa Anda :sumber
Polos dan sederhana:
Jika Jenkins melihat langkah build (yang juga merupakan skrip) keluar dengan kode bukan nol, build tersebut ditandai dengan bola merah (= gagal).
Mengapa hal itu terjadi bergantung pada skrip build Anda.
Saya menulis sesuatu yang serupa dari sudut pandang lain, tetapi mungkin itu akan membantu untuk tetap membacanya: Mengapa menurut Jenkins bangunan saya berhasil?
sumber
Jadi dengan menambahkan
#!/bin/sh
kehendak memungkinkan Anda untuk mengeksekusi tanpa opsi.Ini juga membantu saya dalam memperbaiki masalah di mana saya menjalankan skrip bash dari master Jenkins pada budak Linux saya. Dengan hanya menambahkan di
#!/bin/bash
atas skrip saya yang sebenarnya di blok "Execute Shell", itu memperbaiki masalah saya karena jika tidak menjalankan windows git menyediakan versi bash shell yang memberikan kesalahan.sumber
Dalam Jenkins ver. 1.635, tidak mungkin untuk menampilkan variabel lingkungan asli seperti ini:
Dalam hal ini, Anda harus mengaturnya di variabel lain.
sumber