Pada proyek pengembangan modern, terutama untuk aplikasi berbasis Node.js, salah satu tantangan yang sering kita hadapi dalam CI/CD pipeline adalah waktu build yang lambat. Hal ini biasanya disebabkan oleh dependencies yang besar (seperti node_modules) yang harus diunduh setiap kali pipeline berjalan. Selain itu, penyimpanan artifacts yang kurang terstruktur dapat mengakibatkan penggunaan ruang yang berlebihan dan mempersulit pengelolaan pipeline.
Masalah utama yang sering muncul:
- Pipeline lambat: Dependencies yang tidak di-cache harus diunduh ulang pada setiap pipeline, yang memperpanjang waktu eksekusi.
- Ruang penyimpanan yang boros: Artifacts besar atau direktori seperti
node_modulesdisimpan sebagai hasil build, yang menghabiskan ruang dan memperlambat pipeline.
Pembahasan:
Solusi dengan Cache dan Artifacts Berdasarkan Environment
Untuk mengatasi masalah ini, kita bisa menerapkan strategi cache dan pengelolaan artifacts yang lebih efisien dengan menyesuaikan berdasarkan environment. Salah satu caranya adalah dengan menggunakan variabel environment seperti $CICD_ENV untuk mengatur key cache dan rules pipeline. Dengan strategi ini, dependencies akan di-cache dengan cara yang tepat, sehingga pipeline menjadi lebih cepat dan lebih terstruktur.
Langkah-langkah Solusi:
1. Menggunakan Variabel Environment untuk Cache Key
Variabel environment seperti $CICD_ENV bisa digunakan untuk menentukan key cache. Ini memastikan bahwa cache akan tergantung pada environment yang digunakan, seperti build-deploy atau deploy-only. Dengan cache yang terpisah per environment, pipeline menjadi lebih terkontrol dan efisien.
variables:
CICD_ENV: "build-deploy" # Jika ada library baru (untuk FE aktifkan ini)
#CICD_ENV: "deploy-only" # Jika tidak ada library baru
stages:
- build
- deploy
build-app:
stage: build
image: totorajo/nodemon:20.17-alpine
script:
- npm install
cache:
key: "$CICD_ENV" # Cache disesuaikan berdasarkan isi CICD_ENV
paths:
- node_modules/ # Cache direktori node_modules
artifacts:
paths:
- package-lock.json # Artifacts hanya menyimpan file yang penting
rules:
- if: '$CICD_ENV == "build-deploy" && ($CI_COMMIT_BRANCH =~ /^staging.*/ || $CI_COMMIT_BRANCH =~ /^production.*/)'
Penjelasan:
- Cache Key Berdasarkan
$CICD_ENV: Dengan menggunakan variabel environment$CICD_ENVsebagai key cache, kita bisa mengatur cache yang spesifik untukbuild-deploydandeploy-only. Ini memungkinkan cache yang sesuai digunakan, misalnya ketika ada update dependencies. - Cache
node_modules: Cache menyimpan direktorinode_modules/, yang menghindari pengunduhan ulang dependencies jika sudah ada di cache. - Artifacts
package-lock.json: Artifacts menyimpan file yang penting sepertipackage-lock.jsonuntuk kebutuhan audit atau deployment, namun tidak menyimpan direktori besar sepertinode_modules. - Rules: Pipeline hanya berjalan jika environment
$CICD_ENVadalahbuild-deploydan branch adalahstagingatauproduction. Ini memastikan pipeline tidak berjalan sembarangan di branch yang tidak relevan.
2. Pengelolaan Artifacts yang Efektif
Salah satu tantangan dalam CI/CD pipeline adalah memastikan hanya file yang diperlukan disimpan sebagai artifacts. Dalam konteks ini, menyimpan file package-lock.json sebagai artifacts sangat penting karena bisa digunakan untuk audit dan pengecekan dependencies, sementara node_modules tidak perlu disimpan karena ukurannya yang besar.
artifacts:
paths:
- package-lock.json
expire_in: 1 day # Artifacts akan dihapus setelah satu hari
Penjelasan:
- Artifacts
package-lock.jsondisimpan untuk memverifikasi dependencies yang digunakan selama build. File ini dapat digunakan untuk audit atau untuk memastikan konsistensi antara build dan deployment. - Expire Time: Artifacts akan dihapus secara otomatis setelah 1 hari, sehingga tidak memakan ruang penyimpanan secara permanen.
3. Mengelola Cache Tanpa expire_in
Tidak seperti artifacts yang memiliki opsi expire_in, cache tidak memiliki parameter ini. Namun, kita bisa mengelola cache melalui cache key yang dinamis. Key cache yang berubah berdasarkan environment atau branch akan memastikan cache lama tidak digunakan lagi setelah ada perubahan.
cache:
key: "$CICD_ENV-$CI_COMMIT_REF_NAME" # Key cache yang unik per environment dan branch
paths:
- node_modules/
Penjelasan:
- Key Cache Berdasarkan
$CICD_ENV-$CI_COMMIT_REF_NAME: Ini memastikan cache akan berbeda untuk setiap kombinasi environment dan branch. Misalnya, cache untukbuild-deploypada branchstagingakan berbeda dari cache pada branchproduction. Ketika environment atau branch berubah, cache otomatis diperbarui. - Retensi Cache di GitLab: Secara default, retensi cache diatur oleh administrator GitLab. Jika kita perlu menghapus atau memperbarui cache secara manual, kita bisa mengganti key cache, sehingga cache baru akan digunakan dalam pipeline berikutnya.
4. Memastikan Pipeline Berjalan pada Branch Tertentu
Penggunaan rules dalam pipeline memastikan bahwa pipeline hanya berjalan pada branch yang relevan, seperti staging dan production. Ini membantu dalam menghindari pipeline yang tidak perlu pada branch lain, yang bisa membuang-buang sumber daya.
rules:
- if: '$CICD_ENV == "build-deploy" && ($CI_COMMIT_BRANCH =~ /^staging.*/ || $CI_COMMIT_BRANCH =~ /^production.*/)'
Penjelasan:
- Branch Spesifik: Pipeline hanya akan berjalan pada branch
stagingatauproductionjika$CICD_ENVbernilaibuild-deploy. Ini memastikan pipeline berjalan sesuai dengan kebutuhan deploy yang diinginkan, dan tidak memproses branch lain yang tidak diperlukan.
Rangkuman: Optimasi CI/CD Pipeline yang Efektif
Dengan menerapkan strategi ini, kita bisa membuat CI/CD pipeline di GitLab lebih cepat dan efisien. Berikut adalah beberapa poin utama yang bisa kita ambil:
- Caching Berdasarkan Environment: Menggunakan variabel environment untuk menentukan key cache (
$CICD_ENV), memungkinkan cache yang berbeda untukbuild-deploydandeploy-only. - Pengelolaan Artifacts yang Tepat: Hanya file penting seperti
package-lock.jsonyang disimpan sebagai artifacts, sementara file besar sepertinode_modulesdihindari untuk menyimpan. - Pipeline Hanya pada Branch Tertentu: Dengan rules yang spesifik, pipeline hanya berjalan di branch
stagingdanproduction, menghindari eksekusi yang tidak perlu. - Cache Tanpa
expire_in: Untuk cache, penggunaan key dinamis berdasarkan environment dan branch adalah cara efektif untuk mengelola kapan cache diperbarui, menggantikanexpire_inyang hanya tersedia untuk artifacts.
Dengan pendekatan ini, pipeline tidak hanya lebih cepat, tetapi juga lebih hemat ruang penyimpanan dan terkontrol sesuai environment yang digunakan. Ini sangat cocok diterapkan dalam proyek skala besar yang melibatkan banyak dependencies dan deployment terpisah untuk environment yang berbeda.