Optimasi CI/CD Pipelines dengan Pengelolaan Cache dan Artifacts Berdasarkan Environment di GitLab

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_modules disimpan 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_ENV sebagai key cache, kita bisa mengatur cache yang spesifik untuk build-deploy dan deploy-only. Ini memungkinkan cache yang sesuai digunakan, misalnya ketika ada update dependencies.
  • Cache node_modules: Cache menyimpan direktori node_modules/, yang menghindari pengunduhan ulang dependencies jika sudah ada di cache.
  • Artifacts package-lock.json: Artifacts menyimpan file yang penting seperti package-lock.json untuk kebutuhan audit atau deployment, namun tidak menyimpan direktori besar seperti node_modules.
  • Rules: Pipeline hanya berjalan jika environment $CICD_ENV adalah build-deploy dan branch adalah staging atau production. 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.json disimpan 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 untuk build-deploy pada branch staging akan berbeda dari cache pada branch production. 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 staging atau production jika $CICD_ENV bernilai build-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 untuk build-deploy dan deploy-only.
  • Pengelolaan Artifacts yang Tepat: Hanya file penting seperti package-lock.json yang disimpan sebagai artifacts, sementara file besar seperti node_modules dihindari untuk menyimpan.
  • Pipeline Hanya pada Branch Tertentu: Dengan rules yang spesifik, pipeline hanya berjalan di branch staging dan production, 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, menggantikan expire_in yang 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.