Cari Apa?

Auto Build Golang dengan Github Action (Cross OS)

Auto Build Golang dengan Github Action (Cross OS)

Cover Auto Build Golang pakai Github Action

Bahasa pemrograman Go, atau yang biasa disebut Golang merupakan bahasa yang mudah dipelajari karena sintaks yang harus dihapal itu cuma sedikit (mirip kayak Lua sih) dan mirip-mirip kayak C (tapi menurutku sih, mirip dengan JavaScript, karena aku belum pernah main C). Ini contoh kode Golang untuk membuat Hello World:

package main

import "fmt"

func main(){
	fmt.Println("Hello World")
}

Simpel banget kan? Berbeda dengan Java yang mewajibkan kita mengetik kode yang sangat panjang dan sangat teliti soal titik koma. Kalau di Golang, nggak wajib menggunakan titik koma. Bahkan, Golang juga mengurangi penggunaan tanda kurung, seperti di kondisional:

nilai := 80
if nilai < 100 {
	fmt.Println("Yuk belajar")
}

Memang kok, hebat banget. Dengan banyak kemudahan yang ditawarkan oleh Golang, makanya banyak developer yang minat menggunakan Golang. Tapi bukan cuma kemudahannya aja sih yang membuat tertarik. Salah satu fitur yang menjadikan Golang unggulan adalah fitur konkruensinya. Jadi, dalam satu waktu, bisa menjalankan banyak proses.

Fitur ini bertentangan dengan Node JS yang merupakan single thread, artinya satu pekerjaan dalam satu waktu. Kalau Golang, dia multi thread. Jadi, dalam satu waktu bisa mengerjakan banyak pekerjaan secara paralel. Fitur ini didukung oleh teknologi saat ini yaitu CPU yang tidak hanya single core, tapi juga dual core, quad core, hingga seterusnya. Kalau untuk sekelas server, bisa sampai 32 core.

Fitur unggulan berikutnya adalah hasil build Golang adalah machine code. Jadi, dia langsung bisa dijalankan di atas mesin (OS). Berbeda dengan JavaScript yang memerlukan Node JS untuk menjalannya. Begitu pula dengan Ruby dan Python. Kalau Java, dia memerlukan JVM (Java Virtual Machine) untuk menjalankannya.

Hasil build yang merupakan machine code ini mirip dengan C maupun C++. Tapi, pengalaman coding tentu lebih menyenangkan di Golang; sintaks sederhana dan didukung dengan konkruensi. Tapi, yang menjadi masalah adalah ketika kita build kode Golang kita di Linux 64bit, maka hasil buildnya itu hanya bisa dijalankan di Linux 64bit, nggak bisa di Windows maupun Mac. 

Jadi, gimana solusinya?

Setelah aku mencari-cari, ternyata kita bisa memanfaatkan Github Action untuk auto build Golang ke banyak OS. Di sini mungkin aku cuma mencontohkan untuk buildnya ke Linux dan Windows karena aku biasanya pakai Linux dan klienku biasanya pakai Windows. Jadi, kita perlu mengupload kode kita ke Github seperti biasa.

Untuk menggunakan Github Action, syaratnya adalah repositori kita yang berisi dengan kode-kode Golang itu harus public, nggak bisa private. Kalau private, dia nggak bisa jalan Github Actionnya kecuali kita bayar.

Setelah membuat repositorinya, sekarang buat file .github/workflows/release.yml yang berisi:

# workflow name
name: Generate release-artifacts

# on events
on:
  release:
    types: 
      - created

# workflow tasks
jobs:
  generate:
    name: Generate cross-platform builds
    runs-on: ubuntu-latest
    steps:
      - name: Checkout the repository
        uses: actions/checkout@v2
      - name: Generate build files
        uses: thatisuday/go-cross-build@v1
        with:
          platforms: 'linux/amd64, linux/386, windows/amd64, windows/386'
          package: ''
          name: 'app'
          compress: 'false'
          dest: 'build'
      - name: Deploy
        uses: peaceiris/actions-gh-pages@v3
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          publish_dir: ./build

Jadi, kode itu akan berjalan setiap kita membuat release. Setelah Golang dibuild menjadi Windows dan Linux, hasil buildnya itu akan tersimpan di branch gh-pages.

Tapi kenapa kok nggak setiap push aja build Golangnya? Ya untuk menghemat jatah build Github Action tentunya. Kalau kita menjalankan Github Action hanya setiap release, berarti kan memang kita perlu build. Karena nggak semua push itu ada perubahan penting pada kode aplikasi.

Tapi, kalau kamu ingin auto build setiap push repositori, ganti kode berikut:

on:
  release:
    types: 
      - created

dengan:

on:
  push:
    branches:
      - main

Sekarang, bagaimana jika kita ingin menyediakan hasil build nggak cuma untuk Windows dan Linux? Nah, sekarang perhatikan pada bagian:

platforms: 'linux/amd64, linux/386, windows/amd64, windows/386'

Di bagian itu, aku menjelaskan arsitektur OS apa aja yang bisa menggunakan hasil build Golang ini. Untuk melihat kemungkinan hasil build yang bisa kita hasilkan apa aja, ketik go tool dist list di Terminal.

{{ x.judul }}