- Published on
Deploy Laravel dengan webhook Gitlab
- Authors
- Name
- Nur Wachid
- @wach_1
Sebenarnya jika memiliki project di Gitlab.com maka Anda bisa langsung saja menggunakan Gitlab CI/CD nya. Namum memiliki batasan sehingga sampai 10 menit aja.
Setup ACL dan Menambahkannya ke www-data
- Membuat user bernama default dan menambahkannya ke grup www-data ke default
# as root
adduser default
# Append (-a) a secondary group (-G) "www-data" to user "default"
usermod -aG www-data default
# See groups assigned to user "default"
groups default
- Menambahkan ACL permissions di
/var/www
# check setfacl exists
which setfacl
# If doesn't exist:
sudo apt-get install -y acl
# Inspect current ACL's
getfacl /var/www
# Set current and default ACL's for /var/www
sudo setfacl -Rm g:www-data:rwx,d:g:www-data:rwx /var/www
Sekarang user default (bagian dari grup www-data) dapat membaca, menulis dan mengeksekusi direktori file di root /var/www
.
Membuat SSH key di VPS dan menaruhnya di repository yang Anda punya.
Jika Anda belum membuat SSH key di VPS dengan user yang Anda butuhkan (misalnya: default
), silahkan ikuti panduan dari gitlab tentang cara membuat SSH key. Bagi Anda yang sudah membuat lanjut ke langkah di bawah ini untuk mencetak public key:
cd ~/.ssh
cat id_rsa.pub
Selanjutnya, copy paste hasil keluaran tersebut dan taruh di repository Gitlab Anda => Settings => Repository.
sudo
tanpa password untuk reload php-fpm
Melakukan konfigurasi Silahkan login dengan user yang memiliki akses sudo atau user root dan ketik perintah sudo visudo
dan sisipkan baris ini di paling bawah.
# For reload php 8.2
%www-data ALL=(ALL:ALL) NOPASSWD: /usr/sbin/service php8.2-fpm reload
Memasang port custom di firewall.
Karena kita akan menggunakan package Gitlab Webhook dan NodeJS, pastikan Anda memasang port custom di firewall agar firewall membuka akses custom port. Kita bisa memasangnya langsung di terminal server kita.
# nomor 1234 hanyalah contoh, Anda bisa menggantinya sesuai kebutuhan
sudo ufw allow 1234/tcp
# Melakukan pengecekan bila port 1234 masuk dalam daftar
sudo ufw status verbose
Catatan: Setelah itu, silahkan logout dari server dan login ke server.
Mulai tahap 1
- Membuat direktori untuk deploy hook. Saya membuat folder bernama boilerplate di direktori
/home/default/deploy/boilerplate
- Menginstall nodejs dan npm di VPS dengan cara:
sudo apt update
sudo apt install nodejs
sudo apt install npm
# test nodejs
nodejs -v
- Init NPM project dengan cara:
npm init
dan masukkan data-data yang diperlukan serta pastikan "main" diisi dengan value "index.js". - Download package gitlab hook dengan perintah:
npm install --save node-gitlab-webhook
- Membuat file index.js dan isilah script di bawah ini
const http = require('http');
const createHandler = require('node-gitlab-webhook');
// single handler
const handler = createHandler({ path: '/deploy', secret: 'secret' });
const execFile = require('child_process').execFile;
http.createServer(function (req, res) {
handler(req, res, function (err) {
res.statusCode = 404;
res.end('no such location');
});
}).listen(1234);
handler.on('error', function (err) {
console.error('Error:', err.message);
});
handler.on('push', function (event) {
console.log(
'Received a push event for %s to %s',
event.payload.repository.name,
event.payload.ref
);
// Exec a shell script
const execOptions = {
maxBuffer: 1024 * 1024 // Increase max buffer to 1mb
};
// '/home/default/deploy/laravel-basic-deploy/deploy.sh' adalah direktori untuk menjalankan shell script
// Tergantung di mana Anda mau taruh.
execFile('/home/default/deploy/boilerplate/deploy.sh', execOptions, function(error, stdout, stderr) {
if( error )
{
console.log(error)
}
});
});
- Membuat file deploy.sh dan isilah script di bawah ini
#!/usr/bin/env bash
REPO='git@gitlab.com:turahe/boilerplate.git'; #nama repo saya
RELEASE_DIR='/var/www/boilerplate/releases'; # direktori aplikasi saya
APP_DIR='/var/www/boilerplate/app'; # direktori aplikasi saya
RELEASE="release_`date +%Y%m%d%H%M%s`";
# tempat saya menaruh .env production file
# Jika Anda tidak ingin mengikuti cara ini pastikan Anda hapus perintah
# yang ada komentar # Copy .env file
ENV_PRODUCTION='/home/default/www/boilerplate/production/.env';
ROOT_DIR='/var/www/boilerplate';
SHARED_DIR='/var/www/boilerplate/shared';
# Fetch Latest Code
[ -d $RELEASE_DIR ] || mkdir -p $RELEASE_DIR;
cd $RELEASE_DIR;
git clone -b master $REPO $RELEASE;
# Composer
cd $RELEASE_DIR/$RELEASE;
composer install --no-ansi --no-dev --no-interaction --no-progress --no-scripts --optimize-autoloader;
php artisan clear-compiled --env=production;
php artisan optimize --env=production;
# Update permissions
cd $RELEASE_DIR;
chgrp -R www-data $RELEASE;
chmod -R ug+rwx $RELEASE;
# Check if shared directory is not exist
if [ ! -d "$SHARED_DIR" ]; then
# Create shared directory
mkdir $ROOT_DIR/shared;
cd $ROOT_DIR/shared && (mkdir -p storage storage/app storage/app/public storage/framework storage/framework/cache storage/framework/sessions storage/framework/views storage/logs);
fi
# Copy .env file
cp $ENV_PRODUCTION $ROOT_DIR/shared;
## Env File
cd $RELEASE_DIR/$RELEASE;
ln -nfs ../../shared/.env .env;
chgrp -h www-data .env;
## Storage
rm -r $RELEASE_DIR/$RELEASE/storage;
cd $RELEASE_DIR/$RELEASE;
ln -nfs ../../shared/storage storage;
chgrp -h www-data storage;
## Update Current Site
ln -nfs $RELEASE_DIR/$RELEASE $APP_DIR;
chgrp -h www-data $APP_DIR;
## PHP
sudo service php8.2-fpm reload;
## Setup artisan key generate command
cd $APP_DIR;
php artisan key:generate
# Clear conf
php artisan config:clear
php artisan config:cache
# Run migration if you need
php artisan migrate --force
# Symlink storage folder with public folder
php artisan storage:link
- Berikan akses execute untuk deploy.sh dengan perintah:
chmod ug+x deploy.sh
- Coba jalankan perintah
bash deploy.sh
dan apakah berjalan dengan lancar?
Semoga berhasil.
Mulai tahap 2
- Lakukan konfigurasi webhook di Gitlab dari repository kita ke menu Settings => Webhook seperti gambar di bawah ini.
- Jalankan perintah
node index.js
di dalam direktori tadi dan lakukan testing git push pada dropdowntest
di Webhooks yang disediakan Gitlab.
Catatan: Jika Anda mengalami service time out di Gitlab hooks, kemungkinan besar adalah Anda tidak memasang port di VPS Anda atau port Anda pasang salah. Mohon dicek lebih teliti lagi.
Mulai tahap 3
Tentunya kita tidak ingin setiap kali buka terminal dan menjalankan perintah node index.js
. Salah satu cara untuk menghindari ini adalah dengan membuat daemon service yang menjalankan perintah node tadi.
npm install pm2@latest -g
pm2 start index.js --port 1234
pm2 startup
pm2 save