Server production tidak selalu ber-Linux x86-64: instance AWS Graviton dan Azure Ampere memakai ARM64, kolega kita mungkin menjalankan alat CLI di Windows, dan tim desain memakai Mac Apple Silicon. Compiler Go bisa membangun binary untuk seluruh kombinasi tersebut dari satu mesin build — tanpa toolchain tambahan, tanpa mesin virtual, cukup dua variabel environment GOOS dan GOARCH. Chapter ini membangun binary sapa dari chapter Build Binary
untuk empat platform sekaligus, lalu memverifikasi setiap artefaknya.
Matriks GOOS dan GOARCH #
Dua variabel menentukan target build: GOOS memilih sistem operasi dan GOARCH memilih arsitektur CPU. Kombinasi yang paling sering dipakai di production:
| Kombinasi | Platform tujuan | Contoh pemakaian |
|---|---|---|
GOOS=linux GOARCH=amd64 | Linux x86-64 | Server Intel/AMD, image container standar |
GOOS=linux GOARCH=arm64 | Linux ARM 64-bit | AWS Graviton, Raspberry Pi 64-bit |
GOOS=windows GOARCH=amd64 | Windows x86-64 | Alat CLI untuk pengguna Windows |
GOOS=darwin GOARCH=arm64 | macOS Apple Silicon | Mac M1/M2/M3 |
Daftar kombinasi resmi mencakup puluhan pasangan — termasuk android dan ios untuk perangkat seluler — yang bisa dicetak dengan go tool dist list. Program cross-demo.go pada bagian bawah halaman merangkum matriks di atas sekaligus melaporkan platform binary yang sedang berjalan:
package main
import (
"fmt"
"runtime"
)
// target berisi kombinasi GOOS/GOARCH yang paling sering dipakai di production.
var target = [][2]string{
{"linux", "amd64"},
{"linux", "arm64"},
{"windows", "amd64"},
{"darwin", "arm64"},
}
func main() {
fmt.Printf("binary ini berjalan di: %s/%s\n", runtime.GOOS, runtime.GOARCH)
fmt.Println("target build yang umum:")
for _, t := range target {
fmt.Printf(" GOOS=%s GOARCH=%s\n", t[0], t[1])
}
}Output yang Dihasilkan:
binary ini berjalan di: linux/amd64
target build yang umum:
GOOS=linux GOARCH=amd64
GOOS=linux GOARCH=arm64
GOOS=windows GOARCH=amd64
GOOS=darwin GOARCH=arm64Program ini dijalankan di mesin build linux/amd64, sehingga baris pertama melaporkan linux/amd64. Mari kita telaah baris demi baris program di atas:
- Baris 5 (
var target = ...): mendeklarasikan slice berisi pasangan[2]string— struktur data sederhana yang menjaga urutan target tetap stabil, tidak seperti map yang urutannya acak. - Baris 14 (
fmt.Printf(... runtime.GOOS ...)): mencetak platform tempat binary ini berjalan. Nilainya ditentukan saat kompilasi, bukan dibaca dari sistem saat runtime — binary Windows yang dibangun dari Linux tetap melaporkanwindowsbila dijalankan di Windows. - Baris 16–18 (
for _, t := range target): mengiterasi matriks target dan mencetak setiap pasanganGOOS/GOARCHdengan dua verb%s— output dijamin rapi karena datanya tersimpan dalam slice yang urutannya tetap.
Nilai linux/amd64 pada baris pertama output membuktikan bahwa informasi platform ikut terkompilasi ke dalam binary. Binary yang kita bangun untuk Windows pada bagian berikutnya akan melaporkan windows/amd64 saat dijalankan di komputer Windows.
Membangun Empat Target Sekaligus #
Kembali ke modul sapa-deploy dari chapter pertama. Kita bangun empat binary hanya dengan mengganti variabel environment per perintah — source, module, dan flag tetap sama:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o sapa-linux-amd64
CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -o sapa-linux-arm64
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o sapa-windows-amd64.exe
CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build -o sapa-darwin-arm64
ls -lh sapa-linux-amd64 sapa-linux-arm64 sapa-windows-amd64.exe sapa-darwin-arm64Output yang Dihasilkan:
-rwxrwxr-x 1 z z 2.4M Oct 13 13:22 sapa-darwin-arm64
-rwxrwxr-x 1 z z 2.3M Oct 13 13:22 sapa-linux-amd64
-rwxrwxr-x 1 z z 2.3M Oct 13 13:22 sapa-linux-arm64
-rwxrwxr-x 1 z z 2.4M Oct 13 13:22 sapa-windows-amd64.exeEmpat binary siap salin ke empat platform berbeda. Sufiks .exe pada target Windows bukan gaya penamaan — Windows memerlukan ekstensi tersebut agar berkas dikenali sebagai executable. Nama berkas yang memuat GOOS-GOARCH juga bukan kebetulan: pola aplikasi-v1.2.3-linux-arm64 seperti ini akan menjadi standar penamaan artefak rilis di chapter Release dan Versioning
.
Verifikasi Target dengan file #
Mesin build kita berjalan di linux/amd64, jadi tiga dari empat binary tersebut tidak bisa dieksekusi di sini. Perintah file membaca header executable tanpa menjalankannya — bukti paling jujur bahwa tiap binary ditujukan ke platform yang benar:
file sapa-linux-amd64 sapa-linux-arm64 sapa-windows-amd64.exe sapa-darwin-arm64Output yang Dihasilkan:
sapa-linux-amd64: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, Go BuildID=rf6pt3NiFUGvVRc3_CmT/ZIAbJRT-FJ2-6Sp4RImf/AJRIhOkT9MOGChO6_9eK/kheHdaPA5NA9GcH1H6GC, BuildID[sha1]=b26244bba140d38d6d1b83bcaf2bb31f983e6bb6, with debug_info, not stripped
sapa-linux-arm64: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), statically linked, Go BuildID=Z06e9sblcDGxrdCvcAvE/OcAgJ1ZHcj2lEH8jnFnQ/fQXOQ9atEQtMRkJVPF/-g5w4HiTOJNYnmMJOPdM, BuildID[sha1]=d1757b40cf52570fcea493661a67f15015083d6a, with debug_info, not stripped
sapa-windows-amd64.exe: PE32+ executable for MS Windows 10.00 (console), x86-64, 16 sections
sapa-darwin-arm64: Mach-O 64-bit arm64 executable, flags:<|DYLDLINK|PIE>Ketiga format tersebut adalah format executable asli tiap platform: ELF untuk Linux, PE32+ untuk Windows, dan Mach-O untuk macOS. Baris statically linked pada kedua target Linux juga penting — binary tersebut tidak membawa ketergantungan glibc, sehingga tetap berjalan di distro apa pun dan di image container scratch.
Batasan: CGO dan Cross Compilation #
Cross compilation semudah ini karena compiler Go tidak memanggil compiler C. Begitu CGO_ENABLED=1 dan program memakai library C, mesin build harus memiliki toolchain C untuk platform target — misalnya aarch64-linux-gnu-gcc untuk Linux ARM64. Toolchain silang seperti itu jarang tersedia dan rawan mismatch versi library. Praktik umum di production karena itu sederhana: bangun dengan CGO_ENABLED=0 (seperti keempat perintah di atas), lalu biarkan resolver DNS Go murni menggantikan resolver libc.
Distribusi Lebih dari Empat Target #
Pola perintah di atas melelahkan bila target bertambah: perintah build per platform, penamaan, checksum, dan arsip .tar.gz/.zip masing-masing. Alat ekosistem seperti GoReleaser mengotomatiskan seluruh daftar tersebut dari satu berkas konfigurasi — kapan pun sebuah tag v1.2.3 didorong, alat tersebut membangun matriks target, menandai checksum, dan menyusun catatan rilis. Kita akan merakit versi manual dari alur itu di chapter Release dan Versioning
, lalu menyiapkan jalur pulangnya di Rollback dan Recovery
.
Binary untuk berbagai platform kini tersedia. Langkah berikutnya adalah menjadikan binary Linux tersebut sebuah service yang hidup terus-menerus di server — chapter Linux Service (systemd) memulainya.
Referensi #
- Dokumentasi perintah go
— daftar resmi variabel environment
GOOS,GOARCH, danCGO_ENABLED. - Download and install Go — panduan resmi toolchain sebagai titik awal build.
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
cross-demo.go
Unduh berkaspackage main
import (
"fmt"
"runtime"
)
// target berisi kombinasi GOOS/GOARCH yang paling sering dipakai di production.
var target = [][2]string{
{"linux", "amd64"},
{"linux", "arm64"},
{"windows", "amd64"},
{"darwin", "arm64"},
}
func main() {
fmt.Printf("binary ini berjalan di: %s/%s\n", runtime.GOOS, runtime.GOARCH)
fmt.Println("target build yang umum:")
for _, t := range target {
fmt.Printf(" GOOS=%s GOARCH=%s\n", t[0], t[1])
}
}