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