Penugasan 3 AJK, menerapkan implementasi CI/CD pada aplikasi Tamiyochi menggunakan Github Actions dan Docker.
Dikerjakan oleh Mohammad Idris Arif Budiman ( 5025221114 )
Penugasan ini bertujuan untuk menerapkan CI/CD pada aplikasi Tamiyochi menggunakan Github Actions dan Docker. Ketika terjadi perubahan pada repository Github, Github Actions akan melakukan proses build, membuat image baru, dan mengupdate image pada Docker Hub. Selanjutnya, di server hanya perlu melakukan pull image dan menjalankan container baru.
Dibuat Dockerfile dan docker-compose.yml untuk melakukan kontainerisasi aplikasi Tamiyochi. Dockerfile digunakan untuk membuat image aplikasi Tamiyochi.
FROM php:8.2-fpm-alpine
RUN apk update && apk add --no-cache \
npm \
curl \
git \
unzip \
bash && \
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer && \
npm install -g yarn && \
docker-php-ext-install pdo pdo_mysql
COPY ./Tamiyochi/ /var/www/html/
COPY ./Tamiyochi/.env.example /var/www/html/.env
WORKDIR /var/www/html
RUN composer install --no-dev --no-interaction --no-progress --no-suggest --quiet
RUN yarn && yarn build
RUN chmod -R 777 /var/www/html/ && chown -R www-data:www-data /var/www/html/
EXPOSE 9000
CMD ["./entrypoint.sh"]
Dockerfile ini digunakan untuk membuat image aplikasi Tamiyochi. Menggunakan base image php:8.2-fpm-alpine. Kemudian, melakukan update dan install beberapa package yang dibutuhkan, seperti npm, curl, git, unzip, bash, dan composer. Selanjutnya, menginstall composer dan yarn. Kemudian, menginstall ekstensi pdo_mysql untuk menghubungkan aplikasi dengan database MySQL. Selanjutnya, menyalin kode aplikasi ke dalam container dan mengubah permission file. Menyalin file .env.example ke dalam container. Menjalankan perintah composer install dan yarn untuk menginstall dependency aplikasi. Terakhir, mengekspose port 9000 dan menjalankan script entrypoint.sh.
#!/bin/bash
php artisan key:generate
php artisan migrate
php artisan db:seed
php artisan storage:link
php-fpm
Script entrypoint.sh ini digunakan untuk menjalankan beberapa perintah saat container dijalankan. Pertama, script ini akan mengenerate key baru untuk aplikasi, melakukan migrasi database, melakukan seeding database, dan membuat symlink untuk storage. Terakhir, script ini akan menjalankan php-fpm untuk menjalankan aplikasi.
version: "3.8"
services:
mysql:
image: mysql
container_name: database
restart: always
environment:
MYSQL_DATABASE: pbkk
MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
networks:
- laravel-network
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
timeout: 20s
retries: 10
app:
image: morisab/tamiyochi:latest
container_name: app
networks:
- laravel-network
depends_on:
mysql:
condition: service_healthy
volumes:
- php:/var/www/html
nginx:
image: nginx:latest
container_name: nginx
ports:
- "8080:80"
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf
- php:/var/www/html
networks:
- laravel-network
depends_on:
- mysql
- app
volumes:
php:
networks:
laravel-network:
name: budi-net
driver: bridge
File docker-compose.yml ini digunakan untuk menjalankan container aplikasi Tamiyochi. File ini terdiri dari tiga service, yaitu mysql, app, dan nginx. Service mysql digunakan untuk menjalankan database MySQL. Service app digunakan untuk menjalankan aplikasi Tamiyochi. Service nginx digunakan untuk menjalankan web server Nginx. Service app akan bergantung pada service mysql dan service nginx akan bergantung pada service app. Terdapat volume php yang digunakan untuk menyimpan kode aplikasi. File ini juga mendefinisikan sebuah network yang digunakan oleh ketiga service tersebut.
server {
listen 80;
server_name localhost;
root /var/www/html/public;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass app:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
File nginx.conf ini digunakan untuk konfigurasi Nginx. File ini akan digunakan oleh service nginx pada docker-compose.yml. File ini akan mengatur Nginx untuk mendengarkan pada port 80, mengarahkan root direktori ke /var/www/html/public, dan mengatur konfigurasi PHP-FPM.
Pada repository Github, dibuat file .github/workflows/deploy.yml
untuk melakukan proses CI/CD menggunakan Github Actions. File ini akan dijalankan setiap kali terjadi perubahan pada repository Github. File ini akan melakukan proses build, membuat image baru, mengupdate image pada Docker Hub, dan menjalankan docker-compose di server. Berikut adalah isi file deploy.yml
:
name: Docker build and deploy
on:
push:
branches:
- main
jobs:
build_and_push:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to DockerHub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push
id: build
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: morisab/tamiyochi
cache-from: type=gha
cache-to: type=gha,mode=max
deploy:
needs: build_and_push
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Copy Nginx configuration and Docker-Compose file
uses: appleboy/scp-action@master
with:
host: ${{ secrets.HOST_IP }}
username: moris
key: ${{ secrets.SSH_PRIVATE_KEY }}
source: "./nginx.conf, ./docker-compose.yml"
target: "~/tamiyochi/"
overwrite: true
- name: Execute remote ssh commands
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST_IP }}
username: moris
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
cd ~/tamiyochi
sudo docker pull morisab/tamiyochi:latest
sudo docker compose down
sudo docker compose up -d
File ini terdiri dari dua jobs, yaitu build_and_push dan deploy. Job build_and_push akan dijalankan ketika terjadi push pada branch main. Job ini akan melakukan checkout kode, setup Docker Buildx, login ke Docker Hub, build dan push image baru ke Docker Hub. Job ini menggunakan beberapa action dari Docker, yaitu actions/checkout, docker/setup-buildx-action, docker/login-action, dan docker/build-push-action serta menggunakan cache untuk mempercepat proses build. Job deploy akan dijalankan setelah job build_and_push selesai. Job ini akan melakukan checkout kode, mengcopy file konfigurasi Nginx dan docker-compose, dan menjalankan perintah SSH untuk melakukan pull image baru dari Docker Hub dan menjalankan container baru menggunakan docker-compose.
- Developer melakukan perubahan pada repository Github.
- Github Actions akan mendeteksi perubahan dan menjalankan job build_and_push.
- Job build_and_push akan melakukan checkout kode, setup Docker Buildx, login ke Docker Hub, build dan push image baru ke Docker Hub.
- Setelah proses build selesai, Github Actions akan menjalankan job deploy.
- Job deploy akan melakukan SSH ke server, menyalin file konfigurasi Nginx dan docker-compose, pull image baru dari Docker Hub, dan menjalankan container baru menggunakan docker-compose.
- Aplikasi Tamiyochi akan dijalankan pada server.
Berikut adalah screenshot dari proses CI/CD menggunakan Github Actions dan Docker:
Kondisi ketika mengakses IP server sebelum container dijalankan:
Dapat dilihat muncul pesan "This site can't be reached". Karenanya, aplikasi Tamiyochi belum dijalankan.
Kemudian dilakukan perubahan pada repository untuk mentrigger Github Actions:
Kemudian jika dilihat pada Actions, terdapat workflow yang sedang berjalan:
Ketika diklik pada workflow yang sedang berjalan maka akan muncul job yang sedang berjalan:
Ketika job selesai, maka akan muncul tanda centang hijau pada job tersebut:
Apabila diklik pada job tersebut, maka akan muncul log dari job tersebut:
Setelah proses selesai, maka aplikasi Tamiyochi akan dijalankan pada server: