Dasar Pipeline
Cara Kerja Pipeline
PipelineContainer level atas; satu per commit/trigger
StageKelompok job yang berjalan secara paralel
JobTugas tunggal (script) dalam sebuah stage
RunnerAgen yang menjalankan job
Memicu Pipeline
Push ke branchOtomatis (default)
Merge requestVia workflow:rules atau only: merge_requests
JadwalCI/CD → Schedules di pengaturan proyek
APIPOST /projects/:id/trigger/pipeline
ManualTombol Run Pipeline di menu CI/CD
.gitlab-ci.yml
Konfigurasi Minimal
stages: [build, test, deploy] build-job: stage: build script: echo "Compiling..."
Kata Kunci Global
stagesDefinisikan urutan stage
defaultNilai default untuk semua job
variablesVariabel CI/CD global
workflowKontrol kapan pipeline dibuat
includeImpor file YAML eksternal
Include Template
include: - template: Auto-DevOps.gitlab-ci.yml - local: .ci/lint.yml - project: 'group/shared-ci' file: '/templates/deploy.yml'
Job
Definisi Job
test-unit: stage: test image: node:20 script: - npm ci - npm test
Kata Kunci Job
scriptPerintah shell yang dijalankan (wajib)
before_scriptPerintah sebelum script utama
after_scriptPerintah setelahnya (bahkan jika gagal)
imageImage Docker untuk job
rulesKondisi penyertaan job
needsDependensi DAG (lewati urutan stage)
allow_failurePipeline berlanjut meski job gagal
retryJumlah retry otomatis (0-2)
timeoutDurasi job maksimum
Rules
deploy: rules: - if: '$CI_COMMIT_BRANCH == "main"' when: manual - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' when: never - when: on_success
Stage
Urutan Stage
stages: - lint - build - test - deploy
Stage Default
.preSelalu berjalan pertama
buildStage default ke-1
testStage default ke-2
deployStage default ke-3
.postSelalu berjalan terakhir
DAG dengan needs
test-api: stage: test needs: ["build-api"] # skip waiting for full stage test-web: stage: test needs: ["build-web"] # runs as soon as build-web done
Variabel
Mendefinisikan Variabel
variables: NODE_ENV: "production" DB_HOST: "postgres" job: variables: NODE_ENV: "test" # job-level override
Variabel Bawaan
CI_COMMIT_SHAHash commit lengkap
CI_COMMIT_BRANCHNama branch
CI_COMMIT_TAGNama tag (jika pipeline tag)
CI_PIPELINE_IDID pipeline unik
CI_PROJECT_DIRPath checkout repo
CI_MERGE_REQUEST_IIDNomor MR (hanya pipeline MR)
CI_REGISTRY_IMAGEPath image container registry
Protected & Masked
ProtectedHanya tersedia di branch/tag yang dilindungi
MaskedDisembunyikan di log job
FileDitulis ke file sementara; path ada di variabel
Artifact
Menyimpan Artifact
build: script: npm run build artifacts: paths: [dist/] expire_in: 1 week
Tipe Artifact
pathsFile/direktori yang disimpan
excludePola yang dilewati
expire_inHapus otomatis setelah durasi
reports:junitXML JUnit untuk ringkasan test MR
reports:coverage_reportVisualisasi coverage Cobertura
Laporan JUnit
test: script: pytest --junitxml=report.xml artifacts: reports: junit: report.xml
Cache
Cache Dependensi
test: cache: key: ${CI_COMMIT_REF_SLUG} paths: [node_modules/] script: npm ci && npm test
Cache vs Artifact
CachePercepat job; tidak dijamin; gunakan ulang dengan key yang sama
ArtifactTeruskan file antar job/stage; dijamin
Kebijakan Cache
pull-pushUnduh + unggah (default)
pullUnduh saja (lebih cepat untuk konsumer)
pushUnggah saja (untuk produsen)
Environment
Mendefinisikan Environment
deploy-staging: stage: deploy environment: name: staging url: https://staging.example.com script: ./deploy.sh staging
Fitur Environment
nameNama environment (ditampilkan di UI)
urlLink ke app yang di-deploy
on_stopJob yang dijalankan saat environment dihentikan
auto_stop_inHentikan otomatis setelah durasi
action: stopTandai job sebagai aksi stop
Review App
review: environment: name: review/$CI_COMMIT_REF_SLUG url: https://$CI_COMMIT_REF_SLUG.example.com on_stop: stop-review auto_stop_in: 1 week
Docker
Build & Push Image
build-image: image: docker:24 services: [docker:24-dind] script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA . - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
Service (Sidecar Container)
test: image: python:3.12 services: - postgres:16 - redis:7 variables: POSTGRES_DB: testdb POSTGRES_PASSWORD: secret
Docker-in-Docker
docker:24-dindImage service DinD
DOCKER_TLS_CERTDIRSet ke '/certs' atau '' untuk konfigurasi TLS
DOCKER_HOSTtcp://docker:2376 (TLS) atau :2375
Pola Umum
Monorepo (changes)
test-api: rules: - changes: [api/**/*] test-web: rules: - changes: [web/**/*]
Gerbang Deploy Manual
deploy-prod: stage: deploy when: manual rules: - if: '$CI_COMMIT_BRANCH == "main"'
Matrix Paralel
test: parallel: matrix: - PYTHON: ["3.10", "3.11", "3.12"] DB: ["postgres", "sqlite"] script: tox -e py${PYTHON}-${DB}