# Hasil B3 ULANG — Go/No-Go BATCH B pada Image Python 3.11 (review R18) > **Tanggal**: 2026-10-01 · **Image diuji**: `sicabe/airflow:3.3.2-om203` (ID `a02620e1d0a8`) > — hasil **B2 revisi** (base Python 3.11), menggantikan image py3.13 yang ditolak. > **Metode**: sama dengan B3 pertama — stack eksperimen terisolasi + config & DAG produksi > read-only + container sekali pakai untuk koneksi/dbt. ⚠️ Produksi tidak tersentuh. --- ## 1. VERDICT: 🟢 **GO** BATCH B boleh dilanjutkan ke B4. Penyebab no-go sebelumnya (dbt mati di Python 3.13) **teratasi** dengan kembali ke Python 3.11. --- ## 2. Hasil lengkap | # | Uji | Hasil | |---|---|---| | 1 | `airflow version` | ✅ **3.3.2** | | 2 | **`dbt debug`** | ✅ **"Connection test: OK connection ok" + "All checks passed!"** | | 3 | **`dbt compile --select orders_silver`** | ✅ compiles (SQL model terbentuk) | | 4 | DAG produksi `dag_sitomat_gold_build.py` | ✅ impor bersih | | 5 | DAG produksi `dag_sitomat_gold_build_prod.py` | ✅ impor bersih | | 6 | DAG `sicabe_dq_gold_native.py` | ✅ dimuat sampai tahap *generate workflow*; gagal hanya karena `openmetadata-server` tidak ter-resolve dari container uji (bukan masalah versi) | | 7 | `airflow dags list-import-errors` | ✅ kosong | | 8 | Plugin OM `/pluginsv2/api/v2/openmetadata/health-auth` | ✅ **HTTP 200** | | 9 | Plugin OM `/pluginsv2/` | ✅ **HTTP 200** | | 10 | Trino (`TrinoHook`) | ✅ `SELECT 1` → `[[1]]`; bronze: `orders`, `orders_incremental` | | 11 | MinIO (`S3Hook`) | ✅ bucket `['iceberg-data']`, `check_for_bucket` True | | 12 | MySQL klien eksternal (`MySqlHook`) | ✅ `('8.0.40', 'asdp')`; tabel `passenger_productions`, `trx_booking` | | 13 | OPA (aturan bronze `data-engineer`) | ✅ utuh (`bronze_orders`: ddl/select/write) | Verifikasi dari **build** (step #18–#24): 5 klien DB, `mysqlclient` C termuat + `libmariadb.so.3`, provider mysql, `dbt + great_expectations`, `flask_appbuilder` + **plugin OM dapat dimuat** (`RestApiPlugin`), `pip check` bersih. --- ## 3. Ringkasan perjalanan B2 (tiga percobaan) | Percobaan | Masalah | Penyelesaian | |---|---|---| | **1** | Build memakai Python 3.13 → **dbt mati** (mashumaro/Annotated) | Diputuskan pindah ke Python 3.11 (lihat `b3-hasil-uji.md`) | | **2** | Build py3.11: pip install 62 menit (jaringan PyPI ~60–80 kB/s) lalu gagal di **penjaga regresi yang saya tulis** | Penjaga dipanggil dengan 1 argumen → `TypeError: Annotated[...] should be used with at least two arguments`. Diperbaiki menjadi `te.Annotated[int, 'meta']`. ⚠️ Galat itu justru membuktikan jalur Annotated **ada** di py3.11 | | **3** | — | ✅ **BERHASIL** (langkah pip ter-cache → selesai cepat) | Catatan operasional: build percobaan 1 sempat **dibatalkan** karena client `docker build` ikut mati saat shell pengawas dihentikan (`nohup` tidak cukup — perlu `setsid`). --- ## 4. Konsekuensi & langkah berikutnya - **Image target BATCH B**: `sicabe/airflow:3.3.2-om203` (ID `a02620e1d0a8`, 3.2 GB). - Image py3.13 (`3.3.2-om203-py313`) **tidak dipakai** — disimpan sebagai bukti no-go. - `Dockerfile.332` + `requirements.332.in/.lock` sudah final untuk py3.11; lock hanya **44 baris** berbeda dari produksi. - Berikutnya: **B4** — naikkan `AIRFLOW_IMAGE` + `OPENMETADATA_VERSION` di `environment.defaults.sh` lalu `docker compose up -d`. - Bukti rollback: `deploy/output/merge-airflow332-rollback.md` (dump sudah diuji pulih). --- ## 5. Kesalahan uji saya pada B3r (agar tidak terulang) | # | Kesalahan | Akibat | |---|---|---| | 1 | Penjaga regresi `Annotated.__class_getitem__((int,))` — argumen kurang satu | **Positif palsu**: build gagal padahal sehat | | 2 | Uji MinIO hanya meng-`source deploy/.env`, tanpa `environment.defaults.sh` | `MINIO_ROOT_USER` kosong → `NoCredentialsError` (bukan masalah image) | | 3 | `pgrep -f` mencocokkan perintah saya sendiri | PID yang dilaporkan tidak sahih saat memantau build |