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

1name: Project CI
2
3on:
4  push:
5    branches:
6      - master
7
8jobs:
9  deploy-docker:
10    runs-on: ubuntu-latest
11    steps:
12      - name: Set up QEMU
13        uses: docker/setup-qemu-action@v1
14      - name: Set up Docker Buildx
15        uses: docker/setup-buildx-action@v1
16      - name: Login to DockerHub
17        uses: docker/login-action@v1
18        with:
19          username: ${{ secrets.DOCKERHUB_USERNAME }}
20          password: ${{ secrets.DOCKERHUB_TOKEN }}
21      - name: Build and push
22        id: docker_build
23        uses: docker/build-push-action@v2
24        with:
25          push: true
26          tags: mmuflih55/react
27

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

1version: "3"
2
3services:
4  react-project:
5    container_name: react
6    image: index.docker.io/mmuflih55/react
7    restart: always
8    environment:
9      - PORT=3000
10    ports:
11      - "3000:3000"
12
13  wathctower:
14    image: containrrr/watchtower:latest
15    container_name: watchtower
16    restart: always
17    volumes:
18      - /var/run/docker.sock:/var/run/docker.sock
19      - /home/rocky/.docker/config.json:/config.json
20    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