Skip to main content

CI CD

Pada bagian ini, kita akan coba membahas cara mensetup proses CI / CD

Cluster Role


Kita dapat membuat 1 cluster role yang memiliki permission untuk melakukan operasi ci/cd

Ini Hanya Perlu dilakukan 1x saat cluster role nya belum ada

Berikut cluster role yang dapat dibuat untuk keperluan ci/cd, silahkan buat file dengan isian berikut:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: CI
rules:
- verbs:
- get
- list
- watch
- update
- patch
apiGroups:
- extensions
- apps
resources:
- deployments
- jobs
- verbs:
- get
- list
- watch
- update
- patch
apiGroups:
- apps
resources:
- deployments
- jobs
- verbs:
- get
- list
- watch
- list
- watch
apiGroups:
- ''
- batch
resources:
- cronjobs
- verbs:
- '*'
apiGroups:
- ''
- extensions
- apps
- batch
resources:
- '*'

Silahkan gunakan dengan perintah berikut ini

kubectl apply -f CI-cluster-role.yaml

Service Account

Kita perlu membuat service account untuk digunakan pada Token

kubectl  -n coba-pertama create serviceaccount ci-cd

Token

Kita perlu membuat Token dengan annotations yang terhubung dengan nama service account, contoh:

apiVersion: v1
kind: Secret
metadata:
name: ci-cd-token
namespace: coba-pertama
annotations:
kubernetes.io/service-account.name: ci-cd
type: kubernetes.io/service-account-token

Silahkan gunakan dengan perintah berikut ini

kubectl apply -f create-token.yaml

Role Binding

Selanjutnya kita perlu membuat rolebinding ke namespace kita antara service account dan cluster role tadi. \n dalam contoh kali ini, nama rolebinding juga "ci-cd" (ini tidak harus).

kubectl -n coba-pertama create rolebinding ci-cd --clusterrole CI --serviceaccount=coba-pertama:ci-cd

Extract Kubeconfig

Kita dapat melakukan "ekstraksi" kubeconfig dengan menggunakan credential yang ada pada tahapan sebelumnya. Silahkan buat shell script dengan code berikut:

#!/bin/sh

SECRET_NAME="ci-cd-token"
server="https://103.135.24.10:6443"
cluster="k3s-bsa-testing"

NAMESPACE="coba-pertama"

ca=$(kubectl -n $NAMESPACE get secret $SECRET_NAME -o jsonpath='{.data.ca\.crt}')
token=$(kubectl -n $NAMESPACE get secret $SECRET_NAME -o jsonpath='{.data.token}' | base64 --decode)

echo "\
apiVersion: v1
kind: Config
clusters:
- name: ${cluster}
cluster:
certificate-authority-data: ${ca}
server: ${server}
contexts:
- context:
cluster: ${cluster}
namespace: ${NAMESPACE}
user: ci-cd
name: ${cluster}
current-context: ${cluster}
users:
- name: ci-cd
user:
token: ${token}
" > kubeconfig_ci_cd.yaml

Silahkan jalankan file berikut, dan akan men-generate file dengan nama kubeconfig_ci_cd.yaml

sh extract_kubeconfig.sh

# atau

chmod +x extract_kubeconfig.sh
./extract_kubeconfig.sh

Value dari kubeconfig ini dapat digunakan pada saat proses authorization pada CI CD nanti.

Github Action

Contoh kali ini pipeline yang akan kita gunakan adalah Github Action.

Workflow

Sebelum itu kita perlu me-create secret yang dibutuhkan terlebih dahulu Berikut workflow yang dapat digunakan:

name: "CI CD Sample"

on:
push:
branches:
- "development"

jobs:
build-and-push:
runs-on: "bsa-ubuntu-runner-1"

steps:
- name: Checkout
uses: actions/checkout@v3
with:
fetch-depth: 0

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
with:
config-inline: |
debug = true
insecure-entitlements = [ "network.host", "security.insecure"]

[registry."${{ secrets.REGISTRY_URL_LOCAL_TAG }}"]
http = true
insecure = true

- name: Login to DockerHub
uses: docker/login-action@v2
with:
username: ${{ secrets.REGISTRY_USERNAME }}
password: ${{ secrets.REGISTRY_PASSWORD }}
registry: ${{ secrets.REGISTRY_URL_LOCAL }}

- name: Build and push
uses: docker/build-push-action@v3
with:
context: .
push: true
file: ./dockerize/Dockerfile
tags: ${{ secrets.REGISTRY_URL_LOCAL_TAG }}/test/sample-reactjs:v0.1.2

deploy-to-cluster:
runs-on: "bsa-ubuntu-runner-1"
needs: build-and-push

steps:
- name: Setup GCP / Kubectl
uses: google-github-actions/setup-gcloud@v0

- name: Setup Kubeconfig
run: |
cat >> ./kubeconfig_testing <<END
${{ secrets.KUBECONFIG_TESTING_LOCAL }}
END

- name: Deploy
run: |
kubectl --kubeconfig ./kubeconfig_testing -n coba-pertama set image deployment/sample-reactjs-fe sample-reactjs-fe=harbor.bsa.id/test/sample-reactjs:v0.1.2 --record

- name: Clean
run: |
rm -rf ./kubeconfig_testing

Pada Workflow ini hanya menggunakan step seminimal mungkin untuk proses cicd.

Catatan:

  • Kita menggunakan self hosted runner dengan label "bsa-ubuntu-runner-1"
  • Adapun config inline pada step setup docker buildx karna kita perlu terhubung dengan registry melalui HTTP
  • Runner dan Registry terhubung dengan IP Local

Secret

Berikut Value dari Key Secret yang digunakan:

  • REGISTRY_URL_LOCAL_TAG = x.x.x.x
  • REGISTRY_URL_LOCAL = http://x.x.x.x/v2/
  • REGISTRY_USERNAME = dari akun robot tiap project harbor
  • REGISTRY_PASSWORD = dari akun robot tiap project harbor
  • KUBECONFIG_TESTING_LOCAL = value dari kubeconfig yang di extract pada step sebelumnya