Bagaimana cara menulis Pipeline untuk membuang bangunan lama?

88

Generator sintaks yang groovy TIDAK berfungsi untuk langkah sampel properties: Set Job Properties. Saya telah memilih Discard old buildsdan kemudian masuk 10ke Max # of builds to keeplapangan dan kemudian Generate Groovydan tidak ada yang muncul.

Versi Jenkins: 2.7.0

tarabyte.dll
sumber
Berfungsi baik untuk saya dengan Jenkins 2.32.3
Michel Jung

Jawaban:

182

Adapun sintaks deklaratif, Anda dapat menggunakan optionsblok:

pipeline {
  options {
    buildDiscarder(logRotator(numToKeepStr: '30', artifactNumToKeepStr: '30'))
  }
  ...
}

Parameter untuk logRotator(dari kode sumber ):

  • daysToKeepStr: sejarah hanya disimpan sampai hari ini.
  • numToKeepStr: hanya log build dalam jumlah ini yang disimpan.
  • artifactDaysToKeepStr: artefak hanya disimpan hingga hari ini.
  • artifactNumToKeepStr: hanya sejumlah bangunan ini yang menyimpan artefaknya.

Informasi lebih lanjut dapat ditemukan di basis pengetahuan Cloudbees dan di dokumen untuk optionsdiblokir .

Vadim Kotov
sumber
1
Apakah ini seharusnya per cabang atau per jalur pipa? Sepertinya tidak berhasil di lingkungan saya.
hidung
Apakah praktik umum perlu merujuk ke kode sumber guna mendapatkan parameter untuk berbagai opsi? Dokumen hanya referensi numToKeepStrdan untungnya saya menemukan tanggapan Anda di sini untuk menemukan params lainnya. Agak kacau bagaimana mereka mendokumentasikan sesuatu. Terima kasih meskipun Anda adalah penyelamat hidup.
emmdee
Dapatkah seseorang menunjukkan konteks untuk meletakkan pernyataan opsi buildDiscarder ini di dalam blok tahapan (multi-pipeline)? Saya sudah mencoba tetapi bangunan saya gagal.
Christopher D. Emerson
54

Anda dapat menggunakan propertiesmetode yang, bersarang di dalam BuildDiscarderPropertyakhirnya memiliki kunci yang ingin Anda setel. Saya masih belum memiliki cara yang solid untuk mencari sintaks yang benar dari setiap kunci. Setelah banyak menebak dan memeriksa:

properties([[$class: 'BuildDiscarderProperty', strategy: [$class: 'LogRotator', artifactDaysToKeepStr: '', artifactNumToKeepStr: '', daysToKeepStr: '', numToKeepStr: '10']]]);

Perhatikan bahwa potongan ini adalah untuk sintaks dengan skrip.

tarabyte.dll
sumber
1
Ini berfungsi tetapi mengapa ini bersarang di dalam dua peta dan bagaimana Anda menyelesaikannya?
Rupert Madden-Abbott
Saya melihat jawaban Anda, dan saya tidak mengerti apa fungsinya. Apakah itu mempertahankan 10 bangunan terakhir atau 10 hari terakhir? Dapatkah saya menyimpan build 10 minggu atau 3 bulan terakhir? Harap jelaskan arti setiap *Strbidang dalam strategy. Ajari seseorang untuk memancing ... dll
Abhijit Sarkar
1
@AbhijitSarkar semua opsi dijelaskan di javadoc kelas itu: github.com/jenkinsci/jenkins/blob/master/core/src/main/java/…
apottere
@apottere 1. Tautan tidak ada di jawaban. 2. Jika saya melihat ke Javadoc, tidak perlu jawaban. Jawabannya harus selengkap mungkin. Tautan eksternal diperbolehkan, selama bagian yang relevan ditempelkan dan dijelaskan di sini.
Abhijit Sarkar
1
@AbhijitSarkar Saya bukan OP, saya hanya memberi tahu Anda di mana Anda dapat menemukan jawabannya.
apottere
18

Untuk Scripted Pipelines digunakan:

properties([
    buildDiscarder(logRotator(daysToKeepStr: '3', numToKeepStr: '3')),
])
StasKolodyuk
sumber
17

Jenkins memiliki halaman pembuat sintaks built-in.

Pipeline-Syntax: Snippet Generator
<your jenkins url> / pipeline-syntax /

Pipeline-Syntax: Directive Generator
<your jenkins url > / directive-generator /

Discard old builds contoh dari Directive Generator buang contoh build lama

Chad Gilman
sumber
8
  1. Untuk membuang build setelah jumlah hari tertentu :

     options {
         buildDiscarder(logRotator(daysToKeepStr: '7'))
     }
    
  2. Untuk membuang build setelah sejumlah build tertentu :

     options {
         buildDiscarder(logRotator(numToKeepStr: '7'))
     }
    
Jerald Sabu M.
sumber
Baru saja menambahkan jumlah hari untuk mempertahankan bangunan, selain dari jumlah total bangunan yang harus dipertahankan :)
Jerald Sabu M
Anda harus menggunakan komentar untuk hal semacam itu. Saya telah memperbarui jawaban saya.
Vadim Kotov
Saya tidak punya reputasi untuk menambahkan komentar.
Jerald Sabu M
Sekarang kamu punya. Tetapi secara umum, jika Anda tidak memiliki reputasi, Anda tidak boleh menjawab daripada berkomentar .
Vadim Kotov
6

Jawaban Vadim tidak berhasil untuk saya karena alasan yang tidak diketahui. Saya menyederhanakannya sebagai berikut dan berfungsi sekarang:

options {
    buildDiscarder(logRotator(numToKeepStr: '3'))
}
Firdaus
sumber
6

Untuk pipeline deklaratif, Anda dapat menambahkan ini:

options {

    buildDiscarder(
        logRotator(
            // number of build logs to keep
            numToKeepStr:'5',
            // history to keep in days
            daysToKeepStr: '15',
            // artifacts are kept for days
            artifactDaysToKeepStr: '15',
            // number of builds have their artifacts kept
            artifactNumToKeepStr: '5'
        )
    )
}
bhordupur
sumber
Thx, tapi dimana kamu menemukan infonya? Kode?
diamj
1
Saya biasanya melakukannya dari sini jenkins-base-url:port if any/pipeline-syntax/. Ini juga javadoc.jenkins.io/hudson/tasks/LogRotator.html lainnya . Saya juga terkadang melihat kode sumber github dari plugin untuk memahami secara detail. @silencej
bhordupur
2

Jika Anda ingin mengonfigurasi retensi build pada level pekerjaan pipeline multibranch (vs di semua individu Jenkinsfile), ini juga dapat dilakukan: https://issues.jenkins-ci.org/browse/JENKINS-30519?focusedCommentId=325601&page=com .atlassian.jira.plugin.system.issuetabpanels: komentar-tabpanel # comment-325601

Selain itu, BuildRetentionBranchPropertyAnda dapat mengkonfigurasi yang lainnya *BranchPropertydi sini: https://github.com/jenkinsci/branch-api-plugin/tree/master/src/main/java/jenkins/branch

Mereka mungkin tidak ditampilkan di GUI, setidaknya untuk saya dengan Jenkins 2.73.2. Tetapi Anda masih dapat menggunakan JobDSL atau memodifikasi config.xmlsecara langsung (Saya tidak mengatakan itu ;-))

Torben Knerr
sumber
Apakah Anda berbicara tentang Job DSL Plugin ? Ini tidak sama dengan Jenkins Pipelines. Maksud saya, tidak semua orang yang menggunakan Pipelines menggunakan Plugin Job DSL.
Vadim Kotov
@VadimKotov tidak, tidak juga. Saya mengalami masalah saat mengonfigurasi retensi build di Jenkins Pipelines. Saya tidak ingin melakukan itu di Jenkinsfile, tetapi pada tingkat pekerjaan sebagai gantinya. Saya menggunakan Job DSL di sini, tetapi itu tidak terlalu penting karena ini hanya sarana untuk mengotomatiskan pengaturan pekerjaan build. Namun, tampaknya ada bug di GUI yang mencegah pengaturan di atas muncul saat Anda mengkonfigurasi pekerjaan pembuatan secara manual. (JobDSL tidak melakukan apa pun yang tidak dapat Anda lakukan melalui GUI)
Torben Knerr
2

Jika Anda memerlukan cara terprogram (yaitu melakukan ini dari fungsi, daripada menggunakan options{}sintaks pipeline):

def someFunction() {
  ...
  properties([
    buildDiscarder(logRotator(numToKeepStr: '5'))
  ])
}
David Lavender
sumber