Untuk menyelesaikan Workflow Lint & Release Go Fiber, kombinasikan Taskfile lokal untuk pengembangan harian dengan GitHub Actions sebagai CI/CD. Taskfile menyederhanakan perintah linting (golangci-lint), unit test, build, dan release sehingga developer dapat menjalankan pipeline secara konsisten sebelum push. Di sisi GitHub Actions, otomatisasi lint-test-build-release menangani preview release, tagging, pembuatan artifact, dan rollback ketika perlu.

Memahami alur linting dan release untuk Go Fiber

Linting Go Fiber biasanya mengandalkan golangci-lint karena mendukung banyak analyzer sekaligus. Untuk memastikan kode selalu melewati lint, unit test, dan build sebelum release, pipeline harus memiliki urutan yang jelas: lint → test → build → release. Dalam praktiknya, Taskfile memfasilitasi bagian pengembangan lokal, sedangkan GitHub Actions mengeksekusi langkah-langkah yang sama setiap kali kode masuk ke repository.

Linting catch issue sebelum compile, unit test menegaskan logika, build memastikan modul Go bisa dikompilasi ke binary, dan release trigger otomatis memanfaatkan artifact dari hasil build. Preview release (atau draft release) memberi tim kesempatan memverifikasi paket sebelum publikasi final.

Merancang Taskfile untuk lint, test, build, dan release

Taskfile (Taskfile.yml) adalah skrip orchestration lokal yang ringan dan developer-friendly. Saat Taskfile mendefinisikan task tersusun rapi, rekan tim cukup menjalankan task lint atau task release tanpa mengingat parameter berulang.

version: '3'
tasks:
  lint:
    desc: Jalankan golangci-lint untuk seluruh modul
    cmds:
      - golangci-lint run ./...
  test:
    desc: Jalankan unit test dengan race detector
    cmds:
      - go test ./... -race
  build:
    desc: Bangun binary untuk release
    cmds:
      - go build -o ./bin/app ./cmd/app
  release:
    desc: Siapkan release dengan versi dari env
    vars:
      VERSION:
        default: "0.0.1"
    sources:
      - ./bin/app
    cmds:
      - gh release create "v{{.VERSION}}" ./bin/app --generate-notes
      - git tag "v{{.VERSION}}"
      - git push origin "v{{.VERSION}}"

Taskfile di atas mengurutkan lint → test → build → release, memudahkan developer menjaga standar sebelum commit. Variabel VERSION bisa diganti melalui VERSION=1.2.0 task release. Untuk konsistensi, tambahkan pre-task dalam Taskfile yang memanggil lint/test/build sebelum release berjalan.

Menjalankan task lint atau task test secara manual tetap cepat, dan developer mendapat feedback lokal sebelum commit. Ini juga membantu debugging ketika GitHub Actions gagal: cukup jalankan task yang bermasalah.

Integrasi GitHub Actions untuk lint, test, build, dan release

File workflow (.github/workflows/ci-release.yml) menjalankan pipeline yang sama pada setiap push atau PR. Pendekatan ini mencegah merge kode yang tidak lolos lint/test sekaligus menyiapkan build artifact untuk rilisan.

name: CI Lint & Release

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]
  workflow_dispatch:

jobs:
  ci:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout kode
        uses: actions/checkout@v4
      - name: Setup Go
        uses: actions/setup-go@v4
        with:
          go-version: 1.22
      - name: Lingkungan GOPATH
        run: go env
      - name: Lint dengan golangci-lint
        run: golangci-lint run ./...
      - name: Unit test
        run: go test ./... -race
      - name: Build binary
        run: go build -o ./dist/app ./cmd/app
      - name: Upload artifact
        uses: actions/upload-artifact@v4
        with:
          name: go-fiber-app
          path: ./dist/app
  release:
    needs: ci
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'
    steps:
      - name: Checkout kode
        uses: actions/checkout@v4
      - name: Download binary
        uses: actions/download-artifact@v4
        with:
          name: go-fiber-app
      - name: Create draft release
        uses: softprops/action-gh-release@v1
        with:
          tag_name: v${{ github.run_number }}
          name: "Preview v${{ github.run_number }}"
          files: ./dist/app

Workflow di atas memisahkan job ci dan release. Job ci memastikan lint, test, dan build sukses, sedangkan job release membuat draft release hanya ketika branch main di-push dan job ci berhasil. Penggunaan artifact memungkinkan release mengacu ke binary yang sama dengan yang diuji.

Untuk rilis final, tim dapat menyetujui draft release secara manual melalui GitHub UI lalu publish. Jika perlu otomatisasi tagging release produksi, tambahkan langkah git tag + git push di job release dengan versi dari input workflow.

Menangani preview release, tagging, artifact, dan rollback

Preview release berguna untuk memberikan QA akses ke binary terbaru tanpa langsung mem-publish ke publik. Manfaatkan fitur draft release GitHub dan beri nama berbeda (misalnya "Preview v23.10"), lalu kolega bisa download artifact untuk verifikasi.

Tagging otomatis dapat memakai ${{ github.run_number }} atau versi semver dari file manifest. Pastikan versi dikomunikasikan jelas dalam release notes yang dihasilkan oleh gh release create atau action releaser.

Rollback perlu rencana agar perubahan tidak menyebar ke produksi sebelum diperbaiki. Contoh langkah rollback:

  1. Kembalikan branch main ke tag stabil terakhir (git revert atau git reset), lalu push.
  2. Trigger workflow ulang yang menghasilkan draft release versi lama.
  3. Update release notes dan jelaskan alasan rollback untuk tim dan stakeholder.

Catatan debugging: jika pipeline lint gagal, jalankan task lint secara lokal dan bandingkan output golangci-lint, lalu perbaiki analyzer yang paling awal melapor. Jika release gagal saat upload artifact, cek direktori build di runner dan pastikan nama/format sesuai.

Meningkatkan Developer Experience (DX)

Beberapa praktik menjaga DX tim pada workflow ini:

  • Dokumentasikan Taskfile: sertakan README kecil yang menjelaskan urutan task, variabel wajib, serta command untuk release preview.
  • Gunakan skrip wrapper untuk task release saat developer ingin mencoba pipeline penuh tanpa push.
  • Pastikan golangci-lint dan versi Go dijelaskan di repo sehingga semua orang menggunakan toolchain sama.
  • Tambahkan indikator status (badges) untuk lint/test/build di README agar hasil workflow terlihat secara langsung.
  • Siapkan task ci yang memanggil lint & test sehingga developer bisa menjalankan keseluruhan pengujian sebelum commit.

Dengan Taskfile sebagai pintu masuk lokal dan GitHub Actions sebagai kontrol CI/CD, tim Go Fiber mendapat proses lint/test/build/release yang terotomasi tanpa mengorbankan kemampuan debugging atau pemahaman manual.