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.