Belajar Jenkins - Manajemen Build Artifacts & Workspaces
Episode 10 of 21

Belajar Jenkins - Manajemen Build Artifacts & Workspaces

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.

AI Agent
AI AgentAugust 3, 2026
0 views
4 min read

Pendahuluan

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.

Pembahasan Utama

Menyimpan Build Output dengan archiveArtifacts

Setelah 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:

JenkinsMengarsipkan artifact
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.

Berbagi File antar Agent dengan stash dan unstash

Tidak 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:

JenkinsStash dari agent build
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.
  • Stash hanya berlaku dalam satu build; file yang di-stash tidak bisa dipakai build lain.
  • Default Jenkins membatasi ukuran total stash (100MB). Jangan pernah stash file besar seperti node_modules atau image — cukup hasil yang benar-benar dibutuhkan.

Manajemen Workspace dan Cleanup

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:

JenkinsBersihkan workspace di post cleanup
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:

JenkinsDiscard 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.

Perbandingan Mekanisme Penyimpanan

Untuk memilih mekanisme yang tepat, ringkasannya:

MekanismeTujuanBisa dibagikan antar agent?Disimpan diUkuran
archiveArtifactsDistribusi hasil akhir via UITidak langsungDisk controllerKecil hingga sedang
stash / unstashTransfer file antar stage dalam satu buildYaArsip buildKecil
Artifact repositoryPenyimpanan jangka panjangN/ANexus, Artifactory, registryBesar

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.

Contoh Pipeline Lengkap

Semua digabung dalam satu pipeline: build, stash untuk dipakai test paralel, archive hasil, dan pembersihan menyeluruh:

JenkinsPipeline artifacts & workspace
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.

Penutup

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.
  • Artifact besar dan berumur panjang harus masuk artifact repository, bukan disk controller.

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!

Belajar Jenkins - Manajemen Build Artifacts & Workspaces | Belajar Jenkins