Belajar Golang - CI/CD, Release, dan Dependency Management
Episode 17 of 19

Belajar Golang - CI/CD, Release, dan Dependency Management

Episode ini mengotomatisasi kualitas dan rilis: pipeline build dan test dengan GitHub Actions, menjaga dependency aman dengan go mod verify dan govulncheck, serta release workflow dengan versioning, semantic imports, dan distribusi binary.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

Menjalankan build dan test secara manual akan tertinggal. Saat tim bertumbuh, kualitas kode harus dijamin oleh mesin: setiap komit dipakai dalam pipeline, setiap pull request diverifikasi, dan setiap tag menghasilkan release. Episode 17 mengotomatisasi semua itu untuk project Go.

Episode 17 membahas pipeline CI/CD dengan GitHub Actions, pengamanan dependency dengan go mod verify dan govulncheck, serta release workflow yang mencakup versioning, semantic imports, dan distribusi binary lintas platform.

Pipeline dengan GitHub Actions

Workflow Build dan Test

Workflow GitHub Actions didefinisikan di .github/workflows/. Workflow berikut menjalankan format, vet, dan test pada setiap push dan pull request:

.github/workflows/ci.yml
name: CI
on:
  push:
    branches: [main]
  pull_request:
 
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-go@v5
        with:
          go-version: "1.23"
      - run: gofmt -l .
      - run: go vet ./...
      - run: go test -race ./...

go test -race mengaktifkan race detector — wajib untuk project yang memakai goroutine. Langkah build binary bisa ditambahkan untuk memastikan project tetap bisa di-compile untuk arsitektur target.

Caching Dependency

Unduhan dependency berulang memperlambat pipeline. Setup Go di GitHub Actions mendukung cache go.sum otomatis, atau gunakan cache manual:

Cache module di CI
go mod download
go build -o app ./cmd/server

Dengan cache, waktu pipeline bisa turun drastis. Untuk pull request dari kontributor luar, pastikan permission workflow tidak membocorkan secret.

Keamanan Dependency

go mod verify di Pipeline

go mod verify memeriksa apakah module yang tersimpan masih cocok dengan checksum go.sum. Menjalankannya di CI mendeteksi dependency yang rusak atau dimodifikasi sejak unduh.

Verifikasi dan audit di CI
go mod verify
go list -m -json all | jq -r '.Version' | wc -l

govulncheck

govulncheck adalah tool resmi dari Go team yang mendeteksi kerentanan pada dependency project. Ia hanya melaporkan kerentanan yang benar-benar terpanggil dari kode kalian, mengurangi noise.

Install govulncheck
go install golang.org/x/vuln/cmd/govulncheck@latest
Menjalankan govulncheck
govulncheck ./...

Ketika menemukan kerentanan, lakukan go get pkg@versi-terbaru lalu go mod tidy. Integrasikan govulncheck ke pipeline CI agar pull request dengan dependency rentan langsung ditolak.

Release Workflow

Versioning dengan Semantic Versioning

Rilis memakai semantic versioning: MAJOR.MINOR.PATCH. Major berubah untuk breaking change, minor untuk fitur baru, patch untuk perbaikan. Go menerapkan aturan khusus: module v2 ke atas harus menambah sufiks /v2 di path modulnya.

Buat tag rilis
git tag v1.2.0
git push origin v1.2.0

Release Binary dengan goreleaser

goreleaser mengotomatisasi pembuatan release: membangun binary untuk banyak OS dan arsitektur, membuat archive, menulis release notes, dan mengunggahnya ke GitHub Releases.

.goreleaser.yaml
project_name: api-go
builds:
  - env: [CGO_ENABLED=0]
    goos: [linux, darwin, windows]
    goarch: [amd64, arm64]

Jalankan goreleaser release setelah tag dibuat. Hasilnya: file api-go_1.2.0_linux_amd64.tar.gz, api-go_1.2.0_darwin_arm64.tar.gz, dan seterusnya — siap didistribusikan tanpa toolchain Go.

Semantic Imports

Untuk package yang dipakai orang lain, patuhi aturan: jika ada breaking change, naikkan major version dan pindahkan kode ke direktori v2/ atau v3/ dengan path modul sesuai. Konsumen cukup mengupdate versi di go.mod mereka.

Menjaga Pipeline Hijau

Beberapa praktik yang menjaga pipeline tetap sehat:

  • Fail fast: jalankan langkah paling cepat dan paling mungkin gagal lebih dulu.
  • Deterministik: selalu gunakan versi tooling yang tetap.
  • Test di beberapa arsitektur: matriks OS dan arsitektur menangkap masalah cross-compilation.
  • Laporan kualitas: gabungkan coverage dan lint sebagai gate, bukan sekadar info.
  • Proteksi branch: wajibkan semua check lulus sebelum merge.

Dengan pipeline yang sehat, tim bisa merilis sering tanpa takut merusak production.

Penutup

Episode 17 mengotomatisasi perjalanan kode ke production: pipeline CI dengan GitHub Actions yang menjalankan gofmt, go vet, dan go test -race, keamanan dependency dengan go mod verify dan govulncheck, serta release workflow dengan semantic versioning, goreleaser, dan semantic imports.

Inti yang harus dibawa pulang:

  • Pipeline CI menjalankan format, vet, dan test otomatis.
  • go test -race wajib untuk kode ber-goroutine.
  • govulncheck melaporkan kerentanan yang benar-benar terpakai.
  • Rilis memakai semantic versioning MAJOR.MINOR.PATCH.
  • Module v2 ke atas memakai sufiks /v2 di path.
  • goreleaser menghasilkan binary lintas platform untuk release.

Di episode 18 selanjutnya kita akan membahas tooling modern dan fitur stabil terbaru — toolchain go tool, gopls, go test, go fmt, dan go vet, fitur stable seperti fuzz testing, package slices dan maps, serta tren produksi cloud-native Go.