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


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 .


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.


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')),
])

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


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'))
     }
    

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'))
}

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'
        )
    )
}

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 ;-))


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'))
  ])
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.