Giter Club home page Giter Club logo

golang-on-cluster-gke's Introduction

Ci/Cd Simple Website Menggunakan Golang,Docker,dan GKE

Dalam proyek ini saya membuat aplikasi golang yang menampilkan "helloworld" pada path ("/") dengan menggunakan library dari mux dan juga menampilkan halaman portofolio di path ("/portofolio/") dan fungsi github Action golang yang dibuat memiliki fungsi tes yang akan menguji koneksi pada setiap path yang saya buat sebelumnya dan menggunakan CI/CD untuk mendeploy aplikasi ke GKE.

Tools yang di gunakan

  • Golang 1.19
  • Docker
  • Docker hub
  • Github action
  • GKE
  • GCP

Demo

  • setup enviroment kubernetes disini saya menggunakann GKE untuk menjalankan cluster dan simpan di secret github dan juga simpan secret dari nama project yang di buat kedalam secret
    • membuat cluster
 gcloud container clusters create $GKE_CLUSTER \
	--project=$GKE_PROJECT \
	--zone=$GKE_ZONE
  • menyalakan api gcloud
gcloud services enable \
	containerregistry.googleapis.com \
	container.googleapis.com
  • membuat user untuk menjalankan github action
gcloud iam service-accounts create $SA_NAME

gcloud iam service-accounts list

gcloud projects add-iam-policy-binding $GKE_PROJECT \
	--member=serviceAccount:$SA_EMAIL \
	--role=roles/container.admin
gcloud projects add-iam-policy-binding $GKE_PROJECT \
	--member=serviceAccount:$SA_EMAIL \
	--role=roles/storage.admin
gcloud projects add-iam-policy-binding $GKE_PROJECT \
	--member=serviceAccount:$SA_EMAIL \
	--role=roles/container.clusterViewer

gcloud iam service-accounts keys create key.json --iam-account=$SA_EMAIL

export GKE_SA_KEY=$(cat key.json | base64)

echo $GKE_SA_KEY
  • kita setup file yaml awal disini saya akan apply file yaml deploy.yaml dan loadbalancer.yaml dan akan berjalan pada namespace staging
kubectl create ns staging
kubectl apply -f deploy.yaml
kubectl apply -f loadbalancer.yaml
  • lalu kita cek apakah sudah berjalan dengan perintah
kubectl get services --field-selector metadata.name=reksy-web

jika bagian cloud gke sudah di setup maka kita akan langsung ke alur Ci/Cd

  • Saat aplikasi push ke Github, aplikasi akan memanggil Github Action dan membaca alur kerja kode dari file ci-cd.yml.

  • Alur kerja file ci-cd.yaml menentukan platform yang akan di jalankan, dalam hal ini lingkungan berjalan di Ubuntu misalnya dan memicu fungsi untuk checkout github.

  • Untuk menunjukkan versi golang yang akan digunakan di sini, proyek yang saya buat bekerja dengan golang versi 1.19.

  • workflow menjalankan fungsi "go build -v ./.." dan memanggil fungsi main.go dan akan mengunduh repositori yang digunakan dalam aplikasi yang saya gunakan setelah membangun aplikasi ini dan juga menjalankan perintah "go test ". - v ./." lalu golang akan mencari file test case yang sebelumnya dibuat pada file main_test.go.

  • workflow menjalankan perintah untuk masuk ke Docker Hub. Di sini saya menggunakan github secret untuk menyembunyikan file nama pengguna dan kata sandi saya.

  • Dockerfile yang dibuat sebelumnya akan di build lagi dan akan menjadi file "main" yang akan di pindahkan ke dalam /app dan juga akan mengcopy beberapa folder termaksud folder/portofolio/ jika docker sudah di build dengan sukses makan akan menjalankan fungsi docker push ke docker hub milik saya https://hub.docker.com/u/reksy737

  • workflow akan menjalankan fungsi untuk login pada gcloud cli dan akan mejalankan fungsi mendapatkan fungsi GKE credential yang telah di simpan pada secret github sehingga workflow dapat menjalankan fungsi kubectl

  • workflow akan menjalankan fungsi untuk menganti image docker yang telah terakhir di build sehingga kita tidak perlu untuk apply yaml lagi jika ada perubahan code pada aplikasi golang yang kita build kedepannya

kubectl set image deployment/web-reksy app=reksy737/simpelgoweb:build${{github.run_number}}  -n staging
  • pada tahap terakhir ini kita akan cek apakah website telah berjalan dengan menggunakan dns dari sslip.io dengan menggunakan perintah pada workflow
EXTERNAL_IP=$(kubectl get service reksy-web -n staging -ojsonpath="{.status.loadBalancer.ingress[0].ip}")
DOMAIN="${EXTERNAL_IP}.sslip.io"
curl $DOMAIN
echo $DOMAIN

Contoh jika sudah running websitenya

http://34.143.162.246.sslip.io/ pada halaman helloworld

http://34.143.162.246.sslip.io/portofolio/ pada halaman portofolio

golang-on-cluster-gke's People

Contributors

reksy747 avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.