Cara menambahkan langkah batas waktu ke Jenkins Pipeline

93

Saat Anda menggunakan proyek gaya bebas, Anda dapat menyetel bahwa setelah 20 menit pembuatan dibatalkan jika tidak diselesaikan. Bagaimana ini mungkin dengan Proyek Saluran Pipa Banyak Cabang Jenkins?

Devonte
sumber

Jawaban:

191

Anda dapat menggunakan langkah batas waktu :

timeout(20) {
  node {
    sh 'foo'
  }
}

Jika Anda membutuhkan perbedaan TimeUnitdari MINUTES , Anda dapat memberikan unitargumen:

timeout(time: 20, unit: 'SECONDS') {

EDIT Agustus 2018: Saat ini dengan pipeline deklaratif yang lebih umum (mudah dikenali oleh pipelinekonstruksi level atas ), batas waktu juga dapat ditentukan menggunakan optionspada level yang berbeda (per pipeline keseluruhan atau per tahap):

pipeline {
  options {
      timeout(time: 1, unit: 'HOURS') 
  }
  stages { .. }
  // ..
}

Namun, jika Anda ingin menerapkan batas waktu ke satu langkah dalam pipeline deklaratif, batas waktu tersebut dapat digunakan seperti yang dijelaskan di atas.

StephenKing
sumber
6
Referensi juga tersedia di 1. Jenkins Dashboard<any Pipeline project> ▼ → Pipeline SyntaxStep Reference atau 2. JENKINS_URL/job/<any Pipeline project>/pipeline-syntax/Step Reference .
Gerold Broser
2
Apakah mungkin untuk hanya timeout pada bagian dari memperoleh node, dan tidak menghitung waktu yang dihabiskan untuk menjalankan konten? Yaitu: terkadang node sedang offline dan saya ingin cara agar pekerjaan gagal jika tidak dapat memperoleh node tepat waktu, daripada batas waktu, tetapi tidak ingin pekerjaan gagal jika berhasil memperoleh node dan sedang berjalan ..
Jake
Jika Anda hanya ingin mengetahui apakah node sedang online, Anda dapat bertanya dengan: def n=Jenkins.instance.getNode("ETService3") if (n!=null && n.computer && n.computer.online) { echo "Online" } else { echo "Offline" // wait a little bit and try again }Cara yang sulit untuk memperoleh node dua kali. Pertama kali dengan batas waktu luar, yang kedua dengan batas waktu bagian dalam. Saya kehilangan fiturnya juga.
elou
@ Jake, itu pasti pertanyaan!
charlie_pl
1
Bagaimana Anda membuang pesan kesalahan Anda sendiri saat batas waktu kedaluwarsa?
red888
5

Untuk Declarative Pipeline , disarankan untuk menggunakan langkah batas waktu di bagian options .

Jalankan kode di dalam blok dengan batas waktu yang ditentukan. Jika batas waktu tercapai, pengecualian (org.jenkinsci.plugins.workflow.steps.FlowInterruptedException) dilemparkan, yang menyebabkan pembatalan build (kecuali jika entah bagaimana tertangkap dan diproses). Satuan bersifat opsional tetapi defaultnya adalah menit.

Langkah batas waktu memiliki 3 parameter yang dapat Anda konfigurasikan:

  • waktu (wajib, int)

    • Jumlah batas waktu, jika tidak ada satuan yang dinyatakan durasi dalam menit
  • aktivitas (opsional, boolean)

    • Waktu tunggu setelah tidak ada aktivitas di log untuk blok ini, bukan durasi absolut.
  • unit (opsional, nilai: NANOSECONDS, MICROSECONDS, MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS)

    • Satuan untuk waktu , standarnya adalah MINUTES

Contoh:

timeout(time: 10) // would lead to a timeout of 10 minutes (MINUTES is default value)
timeout(time: 10, unit: 'SECONDS') // a 10 seconds timeout
timeout(time: 10, activity: false, unit: 'MILLISECONDS')

The dokumentasi resmi Jenkins memiliki contoh yang sangat bagus untuk penggunaan timeout:

pipeline {
    agent any
    options {
        timeout(time: 1, unit: 'HOURS') 
    }
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
}
Michael Kemmerzell
sumber
2
activitymemiliki false sebagai default. When activityis false - timeout untuk seluruh pekerjaan, untuk truetimeout untuk aktivitas (untuk mencetak apapun ke log).
Maxim Suslov
1
Saya ingin menambahkan timeoutuntuk tahapan tertentu sedemikian rupa sehingga tahapan selanjutnya harus berjalan dengan anggun. Dalam contoh di atas, pipeline dibatalkan setelah batas waktu dan tahapan selanjutnya tidak dijalankan. Apakah ada cara untuk memenuhi kebutuhan saya? Kode Contoh untuk batas waktu dari tahap tertentu (dari Jenkins Doc resmi):pipeline { agent any stages { stage('Example') { options { timeout(time: 1, unit: 'HOURS') } steps { echo 'Hello World' } } } }
Yash