Menggunakan private library Git dengan Golang module

Wuriyanto
4 min readJun 18, 2019
https://blog.golang.org/gopher

Tidak seperti pada platform lain, Golang tidak menyimpan package, library atau semacamnya di package manager registry terpusat seperti Nodejs (Npm), Python (PIP), dan Java (Maven) . Hal ini memungkinkan kita menyimpan package dan library kita secara private ketika banyak informasi yang kita tidak ingin orang lain ketahui di dalam package dan library yang kita buat.

Sebelum Go 1.11 anda mungkin sudah menggunakan beberapa dependency manager seperti Glide, Dep atau yang lainnya. Saya sendiri banyak mengalami kesulitan ketika berhadapan dengan private repository yang ingin kita pasang pada projek-projek Golang kita. Golang membawa konsep module di versi 1.11 >. Memungkinkan kita tidak perlu menggunakan dependency manager eksternal.

Di Golang sendiri, hampir semua dependency manager menggunakan Git untuk membantu proses yang digunakan oleh package manager untuk mengambil package repository yang berada di Github, Gitlab, ataupun Bitbucket ke lokal komputer.

Kebutuhan

  • Go 1.11 >
  • Git
  • Docker

Karena kita menggunakan Go versi 1.11, jadi saya asumsikan anda sudah paham dan sudah pernah menggunakan Go versi 1.10 ke bawah yang masih menggunakan konsep GOPATH.

Silahkan cek versi Golang anda, pastikan versinya sudah 1.11 ke atas:

$ go version

Cek dukungan terhadap GOMODULE:

$ go mod help

Setelah semua langkah diatas selesai, maka bisa kita lanjutkan dengan membuat projek Golang menggunakan GOMODULE. Projek yang saya buat akan saya namai nasi-goreng. Sesuaikan saja dengan akun Github, Gitlab atau Bitbucket, sesuaikan juga nama projek anda.

$ go mod init github.com/musobarlab/nasi-goreng

Error: Repository not found

Ketika memasang public package dengan menggunakan go get, perintah tersebut akan mencari repository sesuai url yang dimasukan, contoh:

$ go get github.com/wuriyanto48/go-social

Package di atas adalah contoh public package yang saya buat. Jadi tidak akan ada masalah selama package tersebut adalah public. Tetapi ketika kita menggunakan private library dengan menjalankan go get, maka akan muncul error berikut ini

$ remote: Repository not found

Hal ini terjadi karena Git tidak bisa mencari mendeteksi keberadaan private package tersebut. Bisa kita demonstrasikan dengan private package milik saya.

$ go get github.com/wuriyanto48/upper
Package yang sengaja saya buat menjadi private

Private package di atas adalah package yang sengaja saya buat private untuk keperluan pembahasan kita ini. Package tersebut berfungsi untuk mengkonversi string menjadi kapital. Simpel saja, kurang lebih berikut source code-nya.

Upper, private repository yang saya buat private

Setting config global Git

Kita bisa mengatasi masalah error repository not found dengan menambahkan konfigurasi global Git pada komputer yang sedang kita gunakan. Untuk platform lain silahkan anda sesuaikan, karena untuk pembahasan ini saya menggunakan Github.

Langkah pertama anda harus membuat personal token untuk mengakses private repository anda. Silahkan buka https://github.com/settings/tokens, untuk menambahkan token baru anda dan jangan lupa simpan token yang anda buat tadi di tempat yang mudah anda ingat. Token ini sebenarnya mewakili login anda, jadi setiap proses Git seperti push, pull, cloning, dll akan menggunakan token ini.

Langkah kedua, masukan token yang anda buat tadi ke dalam konfigurasi global Git anda.

Sesuaikan dengan username dan token anda. Anda juga bisa mengubah perintah di atas menjadi .sh file supaya mempermudah dan tidak mengulangi perintah di atas.

Script untuk github private repository

Kemudian ubah permission file di atas.

$ chmod +x github_private_repo.sh

Sekarang kita bisa menggunakan script di atas yang sudah dirubah permission-nya.

$ ./github_private_repo.sh my_personal_token

Saya akan menjalankan perintah sebelumnya untuk memasang private package saya yang sebelumnya mengalami kendala.

$ go get github.com/wuriyanto48/upper

Jika langkah-langkah di atas diikuti dengan benar, seharusnya sudah tidak ada masalah.

Memasang script pada fase build image Docker

Ketika projek yang kita buat menggunakan container platform semacam Docker, kita bisa menggunakan script yang kita buat tadi pada saat fase build image Docker-nya. Cukup simpel, shell script tadi akan kita embed di dalam Dockerfile-nya.

Kita bisa menggunakan base image apapun, pada pembahasan ini saya menggunakan Alpine. Dengan catatan versi Golang-nya harus 1.11 ke atas.

Base Image

ARG akan kita gunakan untuk menampung inputan token pada proses build.

Kita juga membutuhkan Git pada proses build image-nya, jadi kita perlu memasangnya(hanya pada fase build). Kita bisa membuangnya setelah proses build image.

Ubah permission pada fase build

Berikut adalah full Dockerfile yang telah kita buat.

Full Dockerfile

Step terakhir adalah melakukan perubahan permission shell script di dalam fase build image, kemudian menjalankan script tersebut dengan mengambil variabel PERSONAL_ACCESS_TOKEN dari parameter yang nanti akan kita masukan. Perintah ini apk del $BUILD_PACKAGES akan menghapus package milik Linux Alpine yang kita gunakan pada proses build yang sudah tidak kita perlukan.

Token Github pada fase build

Kesimpulan

Dengan menggunakan token dan memasangnya pada konfigurasi Git, memungkinkan kita untuk membuat private library atau package yang kita tidak ingin orang lain tau isi dari source code-nya khususnya di Golang. Kita juga bisa menggunakan konfigurasi Git tadi pada fase CI/ CD ataupun fase build image.

Source code:

https://github.com/musobarlab/nasi-goreng

--

--