Containerize Laravel Dengan Docker Dan CI/CD Menggunakan GCP Serverless
Halo teman teman kali ini saya akan membahas topik yang cukup menarik buat saya dan baru saja saya pelajari dan mungkin teman teman butuhkan juga, tulisan ini saya buat agar bisa berkontribusi untuk programmer indonesia dan sebagai review jika suatu saat saya lupa materinya. tanpa berlama lama mari kita mulai dari pondasi di awal.
Yang Ingin Membantu Saya Untuk Terus Berkontribusi Boleh Banget Klik Dibawah
1.Theory
Docker : layanan yang menyediakan kemampuan untuk mengemas dan menjalankan sebuah aplikasi dalam sebuah lingkungan terisolasi yang disebut dengan container. Dengan adanya isolasi dan keamanan yang memadai memungkinkan kamu untuk menjalankan banyak container di waktu yang bersamaan pada host tertentu.
CI : pengintegrasian kode ke dalam repositori kode kemudian menjalankan pengujian secara otomatis, cepat, dan sering.
CD: praktik yang dilakukan setelah proses CI selesai dan seluruh kode berhasil terintegrasi, sehingga aplikasi bisa dibangun lalu dirilis secara otomatis.
GCP: produk layanan komputasi cloud yang dimiliki oleh Google. GCP mencakup infrastruktur cloud publik dan G-Suite versi enterprise dari Android, Chrome, dan antarmuka pemrograman aplikasi untuk pembelajaran mesin dan layanan pemetaan perusahaan.
2.Alasan
Kenapa Menggunakan Docker?
Lingkungan Terisolasi
Bisa Membuat Banyak Versi Aplikasi
Bisa Mencoba Di Beberapa Envirotmen Berbeda
dll.
Kenapa Menggunakan CI/CD ?
Hype Di jaman sekarang
Dapat menguji kode secara otomatis sebelum production
Mempercepat deployment
Mempermudah mendapatkan feedback dari user karena deployment juga cepa
dll
Kenapa Menggunakan GCP ?
Hype Di jaman sekarang
Dunia Serba cloud sekarang
Punya Akun Percobaan(alasan pribadi)
Maintenance Mudah
Di support lansung oleh google
Tool yand disediakan banyak
dll.
Praktik kali ini kita akan menggunakan laravel sebagai wadahnya untuk belajar dan kita tidak akan belajar mengenai bagaimana menginstall docker dan bagaimana menggunakan dan mendaftar gcp. jadi mungkin teman2 yang belum pernah belajar itu semua sebaikya di pelajari terlebih dahulu karena materi kali ini akan lansung pada intinya saja.
3.Praktik Dockerize Laravel
Silahkan Install Laravel di situs resminya
silahkan install docker di komputer anda
masuk ke project laravel kamu dan buat sebuah file dengan nama Dockerfile di folder root
Isikan File Seperti Di Bawah
Saya akan menjelaskan beberapa di bawah untuk yg tidak ada penjelasan silahkan lihat komentar di file
FROM php:7.3-cli-alpine# envirotmen variableENV \ APP_DIR="/app" \ APP_PORT="8001"# memindahkan file atau folder ke direktori yang di inginkan di dockerCOPY . $APP_DIRCOPY .env.example $APP_DIR/.env# menginstall kebutuhan yang ingin kita gunakanRUN apk add --update \ curl \ php \ php-opcache \ php-openssl \ php-pdo \ php-json \ php-phar \ php-dom \ && rm -rf /var/cache/apk/*# menginstall composerRUN curl -sS https://getcomposer.org/installer | php -- \ --install-dir=/usr/bin --filename=composer# menjalankan perintah composerRUN cd $APP_DIR && composer updateRUN cd $APP_DIR && php artisan key:generate# entrypointWORKDIR $APP_DIR#CMD php artisan serve --host=0.0.0.0 --port=$APP_PORT# akses port yang dibukaEXPOSE $APP_PORTyam
From php:7.3-cli-alpine — artinya project ini di bangun pada php 7.3.alpine
WOKDIR — Artinya entry point tempat kita bekerja nanti/folder tempat file dibangun
Mencoba Di Lokal Dengan Perintah
docker build -t laravel-docker:latest -t=tag/nama ->perintah ini untuk membangun image di docker
docker run -p 8000:8001 laravel-docker:latest -> untuk menjalankan container di docker agar bisa di coba di local
Jika file suda running dan tidak ada masalah silahkan buka browser dan kunjungi localhost:8000 maka project laravel akan diakses.
4. Praktik Continius Integration dengan github
masih melanjutkan project yang sama
buat sebuah folder di root dengan nama .github/workflows
buat sebuah file dengan nama laravel-github-actions.yml di dalam folder yang telah di buat diatas note:(nama file bisa di isi dengan sesuka hati)
Isi file dengan
name:Laravel-github-action#nama pipeline bisa sesuai keinginanon:push:branches: [ master ] # maksud dari ketiga kode diatas adalah dijalankan ketika ada push ke branch masterjobs:# pekerjaan yang akan dijalankanlaravel-tests:# nama pekerjaanruns-on:ubuntu-latest# berjalan di os ubuntusteps:# langkah-langkah yg dijalankan - uses:actions/checkout@v3# mengecekout dari github actions - name:Copy .env run: php -r "file_exists('.env') || copy('.env.example', '.env');" # mengecek apakah file .env sudah ada atau belum, jika belum maka akan menyalin file .env.example ke .env
- name:Install Dependencies run: composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist # install dependensi di laravel yg diperlukan
- name:Generate keyrun:php artisan key:generate# generate key laravel - name:Directory Permissionsrun:chmod -R 777 storage bootstrap/cache# mengubah permission untuk storage, bootstrap/cache - name:Create Database# membuat database untuk keperluan testingrun:| mkdir -p database touch database/database.sqlite - name:Execute tests (Unit and Feature tests) via PHPUnitenv:DB_CONNECTION:sqliteDB_DATABASE:database/database.sqliterun:vendor/bin/phpunit --testdox# menjalankan phpunit dengan testdox# materi ci sampai disini# materi cd dibawahdeploy:# nama pekerjaanname:Setup Gcloud Accountruns-on:ubuntu-latest# berjalan di os ubuntuenv:IMAGE_NAME:gcr.io/${{ secrets.GCP_PROJECT_ID }}/${{ secrets.GCP_APP_NAME }}# nama image yg akan di deploysteps: - name:Loginuses:google-github-actions/setup-gcloud@v0# login ke gcloudwith:project_id:${{ secrets.GCP_PROJECT_ID }}# project idservice_account_email:${{ secrets.GCP_EMAIL }}# email service accountservice_account_key:${{ secrets.GCP_CREDENTIALS }}# key service account - name:Configure Dockerrun:gcloud auth configure-docker --quiet# mengkonfigurasi docker - name:Checkout repositoryuses:actions/checkout@v2# mengecekout dari github actions - name:Build Docker image run: docker build . -t gcr.io/${{ secrets.GCP_PROJECT_ID }}/${{ secrets.GCP_APP_NAME }} # membuat image dari laravel yg di deploy
- name:Push Docker imagerun:docker push gcr.io/${{ secrets.GCP_PROJECT_ID }}/${{ secrets.GCP_APP_NAME }}# mengirim image ke gcloud - name:Deploy Docker image run: gcloud run deploy ${{ secrets.GCP_PROJECT_ID }} --image gcr.io/${{ secrets.GCP_PROJECT_ID }}/${{ secrets.GCP_APP_NAME }} --region us-central1 --platform managed --allow-unauthenticated --port 8001 # deploy image ke gcloud
ya
Untuk penjelasan silahkan lihat di komentar
Buat sebuah repository dan hubungkan dengan project laravel yang sekarang
commit dan push project kalian ke github
kunjungi Actions di repo kalian
Jika Pipeline kalian berhasil di bangun akan seperti diatas.
5.Continius Development Dengan GCP Cloud Run Serverless
Mempunyai akun gcp silahkan mendaftar ke GCP nya lansung
name:Laravel-github-action#nama pipeline bisa sesuai keinginanon:push:branches: [ master ] # maksud dari ketiga kode diatas adalah dijalankan ketika ada push ke branch masterjobs:# pekerjaan yang akan dijalankanlaravel-tests:# nama pekerjaanruns-on:ubuntu-latest# berjalan di os ubuntusteps:# langkah-langkah yg dijalankan - uses:actions/checkout@v3# mengecekout dari github actions - name:Copy .env run: php -r "file_exists('.env') || copy('.env.example', '.env');" # mengecek apakah file .env sudah ada atau belum, jika belum maka akan menyalin file .env.example ke .env
- name:Install Dependencies run: composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist # install dependensi di laravel yg diperlukan
- name:Generate keyrun:php artisan key:generate# generate key laravel - name:Directory Permissionsrun:chmod -R 777 storage bootstrap/cache# mengubah permission untuk storage, bootstrap/cache - name:Create Database# membuat database untuk keperluan testingrun:| mkdir -p database touch database/database.sqlite - name:Execute tests (Unit and Feature tests) via PHPUnitenv:DB_CONNECTION:sqliteDB_DATABASE:database/database.sqliterun:vendor/bin/phpunit --testdox# menjalankan phpunit dengan testdox# materi ci sampai disini# materi cd dibawahdeploy:# nama pekerjaanname:Setup Gcloud Accountruns-on:ubuntu-latest# berjalan di os ubuntuenv:IMAGE_NAME:gcr.io/${{ secrets.GCP_PROJECT_ID }}/${{ secrets.GCP_APP_NAME }}# nama image yg akan di deploysteps: - name:Loginuses:google-github-actions/setup-gcloud@v0# login ke gcloudwith:project_id:${{ secrets.GCP_PROJECT_ID }}# project idservice_account_email:${{ secrets.GCP_EMAIL }}# email service accountservice_account_key:${{ secrets.GCP_CREDENTIALS }}# key service account - name:Configure Dockerrun:gcloud auth configure-docker --quiet# mengkonfigurasi docker - name:Checkout repositoryuses:actions/checkout@v2# mengecekout dari github actions - name:Build Docker image run: docker build . -t gcr.io/${{ secrets.GCP_PROJECT_ID }}/${{ secrets.GCP_APP_NAME }} # membuat image dari laravel yg di deploy
- name:Push Docker imagerun:docker push gcr.io/${{ secrets.GCP_PROJECT_ID }}/${{ secrets.GCP_APP_NAME }}# mengirim image ke gcloud - name:Deploy Docker image run: gcloud run deploy ${{ secrets.GCP_PROJECT_ID }} --image gcr.io/${{ secrets.GCP_PROJECT_ID }}/${{ secrets.GCP_APP_NAME }} --region us-central1 --platform managed --allow-unauthenticated --port 8001 # deploy image ke gcloudYa
Setelah Mengatur kita kembali ke kodingan dengan menambahkan isi dari file sebelumnya laravel-github-actions.yml dengan
Penjelasan Ada di File
Setelah itu commit dan push ke repository
Lihat Ke github actions workflownya
Setelah itu kunjungi google console kalian dan masuk ke cloud run untuk melihat alamat website kalian
Yang Ingin Membantu Saya Untuk Terus Berkontribusi Boleh Banget Klik Dibawah
Selesai
Sekian Pembahasan Mengenai Dockerize And Ci Cd Serverles Di GCP. jika ada pertanyaan silahkan. Salam Programmer Makassar