Output build harus dikelola dengan baik agar bisa diunduh, dibagikan antar agent, dan tidak memenuhi disk. Episode ini membahas archive artifacts dengan fingerprinting, transfer file antar node memakai stash dan unstash, serta strategi pembersihan workspace agar infrastruktur Jenkins tetap sehat.

Di episode 9 sebelumnya kita memusatkan logika pipeline lewat Shared Libraries — sekarang Jenkinsfile di semua repo tipis dan konsisten. Tapi ada pertanyaan yang sering dilupakan sampai disk penuh atau orang bertanya "mana hasil build-nya?": ke mana hasil build disimpan?
Bayangkan sebuah pabrik yang terus memproduksi barang tapi gudangnya tidak pernah dirapikan. Barang jadi tersimpan sembarangan, pekerja dari lantai satu tidak bisa mengirim barang ke lantai dua, dan lama-kelamaan gudang penuh sampai proses produksi terhenti. Itulah yang terjadi pada Jenkins yang artifacts-nya tidak diarsipkan, file antar agent tidak bisa dibagikan, dan workspace-nya tidak pernah dibersihkan.
Di episode ini kita membahas tiga hal yang membuat output build bisa diandalkan: archiveArtifacts untuk menyimpan hasil build dan mengunduhnya lewat UI, stash dan unstash untuk memindahkan file antar stage dan antar agent, serta manajemen workspace agar disk tidak pernah penuh dan build lama tidak menumpuk.
archiveArtifactsSetelah aplikasi berhasil dibangun, hasilnya harus disimpan sebagai artefak build. Step archiveArtifacts mengunggah file dari workspace ke Jenkins, sehingga bisa diunduh kapan saja dari halaman build:
stage('Build') {
steps {
sh 'mvn -q package'
}
}
stage('Archive') {
steps {
archiveArtifacts artifacts: 'target/*.jar', fingerprint: true
}
}Parameter artifacts menerima pola glob — di sini semua file jar di dalam direktori target. Parameter fingerprint: true mengaktifkan fingerprinting: Jenkins menghitung checksum file dan melacak build mana yang memproduksinya dan build mana yang memakainya. Ini berguna banget untuk audit: kalau ada bug di versi jar tertentu, kalian bisa mencari build mana yang menghasilkan jar tersebut.
Untuk mengunduhnya, buka halaman job → klik build tertentu → bagian Artifacts → klik nama file. URL unduhan langsung juga tersedia di alamat jenkins di path /job/<nama-job>/lastSuccessfulBuild/artifact/<nama-file> — berguna saat script lain ingin mengambil artifact otomatis.
Warning
Artifact disimpan di disk controller. Mengarsipkan file besar seperti image Docker atau installer ratusan MB akan cepat memenuhi disk JENKINS_HOME. Aturan praktis: arsipkan output kecil yang penting (jar, package, laporan), sedangkan artefak besar simpan di artifact repository seperti Nexus, Artifactory, atau registry container — dan simpan URL-nya sebagai metadata.
stash dan unstashTidak semua stage berjalan di agent yang sama. Stage test paralel dari episode 7 bisa berjalan di node berbeda, dan mereka semua butuh hasil build dari stage sebelumnya. Step stash menyimpan file sebagai arsip yang melekat pada build, lalu unstash memulihkannya di agent lain:
stage('Build') {
steps {
sh 'npm run build'
stash name: 'build-output', includes: 'dist/**'
}
}
stage('E2E Test') {
agent { label 'tester-agent' }
steps {
unstash 'build-output'
sh 'npm run test:e2e'
}
}Stage Build menghasilkan direktori dist, lalu menyimpannya dengan nama build-output. Stage E2E Test dijalankan di agent berlabel tester-agent — agent yang berbeda — dan memulihkan dist tersebut sebelum menjalankan test end-to-end. Ini membuat pipeline bisa menyeimbangkan beban: build di mesin cepat, test di mesin khusus.
Beberapa hal yang perlu dipahami:
stash name: 'build-output', includes: 'dist/**' menentukan pola glob; bisa juga menambahkan exclude untuk file tertentu.Workspace adalah direktori kerja agent tempat pipeline mengeksekusi step. Masalahnya, setiap build yang mengunduh dependensi, melakukan checkout, dan menghasilkan file akan meninggalkan jejak. Tanpa pembersihan, disk agent menumpuk hingga penuh dan build gagal dengan error disk full.
Membersihkan workspace setelah build. Step cleanWs dari plugin Workspace Cleanup menghapus isi workspace. Tempat paling tepat memanggilnya adalah di blok post { cleanup } dari episode 7, karena selalu dijalankan di akhir — termasuk saat build gagal:
pipeline {
agent any
stages {
stage('Test') {
steps {
sh 'npm test'
}
}
}
post {
always {
junit 'reports/**/*.xml'
}
cleanup {
cleanWs()
}
}
}Membuang build lama. Selain workspace, build record yang menumpuk juga menghabiskan disk (artifacts, log, metadata). Step buildDiscarder di blok options otomatis memangkas build lama:
pipeline {
agent any
options {
buildDiscarder(logRotator(numToKeepStr: '10', daysToKeepStr: '30'))
}
stages {
stage('Build') {
steps {
sh 'mvn -q package'
}
}
}
}Konfigurasi di atas menjaga maksimal 10 build terakhir, dan build yang berumur lebih dari 30 hari ikut dibuang — mana pun yang tercapai lebih dulu. Ini menyeimbangkan kebutuhan riwayat (untuk rollback dan audit) dengan keterbatasan disk.
Note
Pahami perbedaan disk: JENKINS_HOME (disk controller) menampung konfigurasi, artifacts, dan riwayat build; workspace hidup di disk agent. Pembersihan workspace melindungi disk agent, sedangkan buildDiscarder melindungi disk controller. Keduanya perlu dikelola, dan di scale besar ada plugin tambahan seperti Disk Usage untuk memonitor siapa yang paling boros disk.
Untuk memilih mekanisme yang tepat, ringkasannya:
| Mekanisme | Tujuan | Bisa dibagikan antar agent? | Disimpan di | Ukuran |
|---|---|---|---|---|
| archiveArtifacts | Distribusi hasil akhir via UI | Tidak langsung | Disk controller | Kecil hingga sedang |
| stash / unstash | Transfer file antar stage dalam satu build | Ya | Arsip build | Kecil |
| Artifact repository | Penyimpanan jangka panjang | N/A | Nexus, Artifactory, registry | Besar |
Aturan praktisnya: stash untuk memindahkan file antara stage dalam satu build, archiveArtifacts untuk hasil yang harus diunduh tim, dan artifact repository untuk apa pun yang besar atau harus hidup lama.
Semua digabung dalam satu pipeline: build, stash untuk dipakai test paralel, archive hasil, dan pembersihan menyeluruh:
pipeline {
agent any
options {
buildDiscarder(logRotator(numToKeepStr: '10', daysToKeepStr: '30'))
}
stages {
stage('Build') {
steps {
sh 'npm ci'
sh 'npm run build'
stash name: 'build-output', includes: 'dist/**'
}
}
stage('Test & Archive') {
steps {
unstash 'build-output'
sh 'npm run test:unit'
archiveArtifacts artifacts: 'dist/**/*.js', fingerprint: true
}
}
}
post {
cleanup {
cleanWs()
}
}
}Alur lengkapnya: build menghasilkan dist, di-stash, lalu di-unstash pada stage berikutnya untuk test dan pengarsipan. buildDiscarder menjaga riwayat build tetap langsing, dan cleanWs di post menghapus sisa workspace setiap kali pipeline selesai — build apa pun hasilnya.
Pada episode 10 ini kita membedah siklus hidup output build: archiveArtifacts dengan fingerprinting untuk menyimpan dan mengunduh hasil build lewat UI, stash dan unstash untuk memindahkan file antar stage dan antar agent dalam satu build, serta manajemen workspace — cleanWs di post { cleanup } untuk mencegah disk agent penuh dan buildDiscarder dengan logRotator untuk membuang build lama dari disk controller.
Inti yang harus kalian bawa:
archiveArtifacts artifacts: 'target/*.jar', fingerprint: true menyimpan hasil build; fingerprint memungkinkan pelacakan asal-usul file.stash dan unstash memindahkan file antar agent dalam satu build; jangan stash file besar.cleanWs() di post { cleanup } membersihkan workspace setiap build, apa pun hasilnya.buildDiscarder membatasi jumlah dan umur build yang disimpan.Sampai di sini kalian sudah menguasai fondasi pipeline yang lengkap: dari penulisan Jenkinsfile hingga pengelolaan output build. Di episode 11 berikutnya kita masuk fase keamanan: Jenkins Security, RBAC & Authentication — mematikan akses anonim, membangun model authorization dengan Role-Based Strategy, dan mengamankan controller dari ancaman eksternal. Sampai jumpa di episode 11!