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
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.
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.
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.
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.
Berikut adalah full Dockerfile yang telah kita buat.
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.
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.