Cara gw setup CI/CD

Cara gw setup CI/CD

Halo… post kali spesial untuk saudara Sudarsono Gadget, soalnya dia yg minta..
pertama kita mungkin bahas dulu apa itu CI/CD

kalo dari sini, CI/CD sndiri itu simpelnya metode untuk deliver applikasi kita ke customer, dengan menggunakan proses automatisasi ke dalam tiap pengembanganya…
untuk kepanjanganya CI itu Continous Integration sedangkan CD itu Continous Delivery

nah di prakteknya itu hasil akhirnya kira-kira gini:
misal kita punya repo di github dan punya branch main/master dan development, setiap kita push ke development, kita bakal otomatis build dan update server development. dan ketika kita push ke server production, kita bakal otomatis deploy ke production.

Cara yg skrg gw pakai ada 2 cara, 2-2nya pake Docker dan Dockerhub, bedanya cuma di proses run deploy aja..
awalnya gw pake cara yg pertama, yaitu pake ssh-action, sampe akhirnya gw dpt client yg untuk akses ke servernya harus pake vpn, dan agak ribet kalo pake ssh-action ini.
akhirnya gw ngulik dan pake lah cara ke dua ini.. yaitu pake watchtower

karena step awalnya sama, marilah kita mulai saja terlebih dahulu dengan setup GHA(github actions) nya.. btw ini ga harus pake github ya.. di gitlab juga ada, namanya gitlab ci/cd. tapi karena gw pakenya github jadi nyontohin nya pake github aja

anggeplah, kita buat project baru pake CRA.
nah skr kita tinggal nambahin 1 file yaitu file workflows, misal kita kasih nama filenya ci
jadi dari root folder, kita tinggal bikin folder .github, terus workflows, dan file workflows kita.. kira2 path nya jadi gini
.github/workflows/ci.yml

sebenernya simplenya isi ci.yml bakal kayak gini

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
name: Project CI

on:
  push:
    branches:
      - master

jobs:
  deploy-docker:
    runs-on: ubuntu-latest
    steps:
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v1
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v1
      - name: Login to DockerHub
        uses: docker/login-action@v1
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}
      - name: Build and push
        id: docker_build
        uses: docker/build-push-action@v2
        with:
          push: true
          tags: mmuflih55/react

simple nya dari script diatas bakal jalanin perintah setiap ada push ke branch master, kita bakal build image dan push ke repo mmuflih55/react.
nah balik lagi masalah diawal, kalo cara pertama. kita tinggal tambahin perintah

1
2
3
4
5
6
7
8
9
10
11
- name: Redeploy docker with SSH
        uses: appleboy/ssh-action@master
        with:
          host: x.xxx.xx.xx
          username: ${{ secrets.SSH_USERNAME }}
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          script: |
            cd test
            docker-compose down
            docker image prune -f
            sudo docker-compose up -d

nah kalo pake cara yang ke 2, kita ga perlu nambahin script diatas ke ci.yml
tapi di server kita perlu install watchtower. kalo gw sih, dijadiin 1 docker-compose biar gampang. contoh:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
version: "3"

services:
  react-project:
    container_name: react
    image: index.docker.io/mmuflih55/react
    restart: always
    environment:
      - PORT=3000
    ports:
      - "3000:3000"

  wathctower:
    image: containrrr/watchtower:latest
    container_name: watchtower
    restart: always
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /home/rocky/.docker/config.json:/config.json
    command: --debug --include-restarting --cleanup -i 600 react

nah kalo kita run compose di atas, setiap 10 menit (600 detik) watchtower bakal cek ada image baru ga di container react. kalo ada dia bakal otomatis pull dan restart containernya.

udah deh.. jadi kita ga perlu cape2 mikirin pull image dan restart containernya setiap ada update.
kalo dari contoh diatas, tinggal push ke branch master, semua beres..

minusnya pake watchtower, kita bakal ngepull terus2an.. dan dari contoh yg gw kasih diatas gw kasih interval 10 menit. jadi misal kita udah push ke master, kita masih harus nunggu sekitar 10 menit untuk project ke rebuild. sedangkan kalo pake ssh-action semua itu bisa di hindari. minusnya kalo dpt client harusin akses ke server pake VPN ya mau ga mau kita harus cari cara lain.

ci/cd
devops
docker