AWS CodeBuild
CodeBuild menjalankan perintah di dalam container sementara, sesuai buildspec. Ia adalah tempat lint, test, build image, dan evaluasi LLM benar-benar dieksekusi.
Intisari
- Satu build project = image, tipe compute, dan
buildspec.yml. - Buildspec punya fase:
install,pre_build,build,post_build. - Caching dependensi memangkas waktu build drastis — atur
cache.paths. - Rahasia diambil lewat
secrets-managerdi blokenv, tidak pernah ditulis literal. - Build punya IAM role sendiri — di sinilah izin memanggil Bedrock untuk evaluasi diberikan.
buildspec.yml
version: 0.2
env:
variables:
AWS_REGION: us-east-1
secrets-manager:
TOKEN_EVAL: prod/eval:token # nama-rahasia:kunci-json
phases:
install:
runtime-versions:
python: 3.13
commands:
- curl -LsSf https://astral.sh/uv/install.sh | sh
- export PATH="$HOME/.local/bin:$PATH"
pre_build:
commands:
- uv sync --frozen
- uv run ruff check .
- uv run mypy .
build:
commands:
- uv run pytest --junitxml=laporan/unit.xml
- uv run python eval/jalankan.py --keluaran laporan/eval.json
post_build:
commands:
- uv run python eval/gerbang.py --laporan laporan/eval.json --minimum 0.85
reports:
unit:
files: [laporan/unit.xml]
file-format: JUNITXML
cache:
paths:
- /root/.cache/uv/**/*
artifacts:
files:
- laporan/**/*
| Fase | Isi yang wajar |
|---|---|
install | Runtime dan toolchain |
pre_build | Dependensi, lint, type check, login ECR |
build | Tes, build image, evaluasi |
post_build | Push image, gerbang kualitas, unggah laporan |
Menjalankan evaluasi LLM di dalam build
Ini penerapan konkret gerbang kualitas dari materi CodePipeline. Skrip eval/jalankan.py memanggil
Bedrock untuk sekumpulan pertanyaan uji, lalu eval/gerbang.py keluar dengan status bukan-nol kalau
skornya turun — dan build gagal.
# eval/gerbang.py — inti gerbangnya cuma beberapa baris
import json, sys, argparse
p = argparse.ArgumentParser()
p.add_argument("--laporan")
p.add_argument("--minimum", type=float)
a = p.parse_args()
skor = json.load(open(a.laporan))["skor_rata2"]
print(f"skor evaluasi: {skor:.3f} (minimum {a.minimum})")
sys.exit(0 if skor >= a.minimum else 1)
Role build butuh izin Bedrock. Kalau evaluasi memanggil model, service role CodeBuild-lah yang
memanggilnya — bukan identitasmu. Kesalahan AccessDeniedException di stage evaluasi hampir selalu
berarti kamu menambahkan izin ke role yang salah.
Yang memengaruhi kecepatan dan biaya
| Setelan | Dampak |
|---|---|
| Cache dependensi | Paling besar. Tanpa cache, tiap build mengunduh ulang semuanya. |
| Ukuran compute | Instance lebih besar sering lebih murah karena durasinya jauh lebih pendek |
| Docker layer cache | Penting kalau kamu mem-build container image tiap commit |
| Timeout | Setel wajar; build yang menggantung tetap ditagih |
| Batch build | Menjalankan beberapa varian paralel, mis. dua model sekaligus |
Latihan: tambahkan buildspec.yml ke proyekmu dengan fase lint dan test, hubungkan ke
pipeline Fase 2 sebelumnya, lalu sengaja buat satu tes gagal dan buktikan pipeline berhenti sebelum deploy.
Terakhir, nyalakan cache dan bandingkan durasi build sebelum dan sesudahnya.
Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.