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:
- Kembalikan branch
mainke tag stabil terakhir (git revertataugit reset), lalu push. - Trigger workflow ulang yang menghasilkan draft release versi lama.
- 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 releasesaat 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 ciyang 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.
Komentar
0 komentar
Masuk ke akun kamu untuk ikut berkomentar.
Belum ada komentar
Jadilah yang pertama ikut berdiskusi!