Deploy website with gitlab webhook

Gitlab ဆိုတာကတော့ open source git hosting တစ်ခုပါ။ အခု gitlab က bitbucket လို unlimited repo ရပါတယ်။ Bitbucket ထက်ပိုကောင်းတာကတော့ unlimited users ပါ အသုံးပြုလို့ရတာပဲ။ Free user အနေနဲ့ supporting တော့ ရမှာ မဟုတ်ပါဘူး။ Gitlab ကို အသုံးပြုပြီးတော့ ကိုယ်ပိုင် github လိုမျိုး git hosting တစ်ခု ဖန်တီးနိုင် သလို gitlab မှာလည်း ကျွန်တော်တို့တွေ ကိုယ်ပိုင် project တွေကို တင်ထားနိုင်ပါတယ်။

အခု ကျွန်တော်ရေးမယ့် အကြောင်းကတော့ gitlab ကို အသုံးပြုပြီး ကိုယ့် server ပေါ်မှာ deployment လုပ်မယ့် အကြောင်းပါ။ ဒီ ဆောင်းပါးက နောက်တချိန် ကျွန်တော်ကိုယ်တိုင် ပြန်မှတ်မိပြီး ပြန်အသုံးပြုလို့ ရအောင် ရေးထားတာပါ၊

ပထမဆုံး ကျွန်တော်တို့တွေ gitlab မှာ account တစ်ခုဆောက်။ Git repo တစ်ခု ဆောက်ပြီး ကျွန်တော်တို့ file တွေကို ဦးစွာ တင်ထားဖို့လိုတယ်။ ပြီးရင် ကျွန်တော်တို့ ရဲ့ file တွေထဲမှာ git push လုပ်ပြီးတာနဲ့ gitlab ကနေ လှမ်းခေါ်မယ့် webhook အတွက် file တစ်ခု ဖန်တီးပေးဖို့လိုပါတယ်။

ကျွန်တော်ကတော့ gitlab.php ဆိုပြီး ဖန်တီးထားပါတယ်။ ဒီ file က git lab ကနေ post method နဲ့ data လှမ်းပို့လိုက်တဲ့ အခါမှာ ဒီဘက် server ကနေ ပြီးတော့ git ကို ပြန်ပြီး pull လုပ်ဖို့ အတွက်ပါပဲ။

Gitlab

gitlab.php ကို အောက်မှာ ရေးထားပါတယ်။

<?php
/* gitlab deploy webhook */
/* gitlab.php?token=ABCDEFG123456789HIJKLMNO123456789PQRSTUVWXYZ0 */

/* security */
$access_token = 'ABCDEFG123456789HIJKLMNO123456789PQRSTUVWXYZ0';

/* get user token and ip address */
$client_token = $_GET['token'];

/* test token */
if ($client_token !== $access_token)
{
    echo "error 403";
    exit(0);
}

/* get json data */
$json = file_get_contents('php://input');
$data = json_decode($json, true);

/* get branch */
$branch = $data["ref"];

/* branch filter */
if ($branch === 'refs/heads/master') {
    /* if master branch*/
    /* then pull master */
    exec("/var/www/gitlab_wehook/mywebsite_com_hook.sh");
}
?>

ဒီ php code က magenx ရဲ့ Github code ကို ပြင်ထားတာပါ။

ပြီးရင်တော့ gitlab ရဲ့ repo က web hooks မှာ

http://www.yourwebsite.com/gitlab.php?token=ABCDEFG123456789HIJKLMNO123456789PQRSTUVWXYZ0

နဲ့ ထည့်လိုက်ရုံပါပဲ။

Trigger ကိုတော့ Push events ပဲရွေးထားပေးပါ။

Server

အခု ssh နဲ့ web server ကို ကျွန်တော်တို့တွေ ဝင်ဖို့ လိုပါတယ်။ ပြီးရင် permission တွေ ပေးဖို့လိုတယ်။ ကျွန်တော်က nginx သုံးတဲ့ အတွက် ကျွန်တော့် web user က www-data ပါ။ www-data အနေနဲ့ ssh ကို ဝင်လို့ မရပါဘူး။ ဒါကြောင့် root permission ရှိတဲ့ account နဲ့ ဝင်ပြီးတော့ www-data ရဲ့ home မှာ ssh key ရအောင် ဖန်တီးဖို့လိုတယ်။ ဒါမှသာ git pull လုပ်တဲ့ အခါမှာ ssh ကို ဖတ်လို့ ရပါလိမ့်မယ်။

mkdir /var/www/.ssh
chown www-data:root /var/www/.ssh
sudo -u www-data ssh-keygen

ဒါဆိုရင် /var/www/.ssh ထဲမှာ id_rsa.pub ကို ဖန်တီးပြီးပါပြီ။

cat /var/www/id_rsa.pub

လုပ်ပြီးတော့ SSH က text တွေကို အရင်ဆုံး Copy ကူး ပြီးရင် gitlab ရဲ့ SSH မှာ သွားပြီးတော့ ထည့်ဖို့လိုပါတယ်။

အခု ကျွန်တော်တို့ gitlab.php ကနေ ခေါ်မယ့် pull shell script ကို ဖန်တီးဖို့လိုပါတယ်။

mkdir /var/www/gitlab_wehook
cd /var/www/gitlab_webhook
vi mywebsite_com_hook.sh

အထဲမှာ ကျွန်တော်တို့ လုပ်ချင်တာတွေကို shell script နဲ့ ရေးထားရုံပါပဲ။ ကျွန်တော်ကတော့ pull ပဲ လုပ်တာဆိုတော့

cd /var/www/mywebsite
git pull origin master

ဒါပါပဲ။ တကယ်လို့ node လိုမျိုးသာ ဆိုရင်တော့ node app ကို အရင် stop လုပ်။ ပြီးရင် pull လုပ်။ ပြီးရင် node app ကို ပြန် run စတာတွေကို ဖန်တီးဖို့ လိုပါတယ်။ အခုကတော့ ပုံမှန် website ဖြစ်တာကြောင့် pull ပဲ ထည့်ထားပါတယ်။

ပြီးရင်တော့ shell script ကို www-data ကနေ ခေါ်လို့ ရအောင် permission ပေးဖို့ လိုပါတယ်။

chown www-data:root mywebsite_com_hook.sh
chmod +x mywebsite_com_hook.sh

Permission ပေးပြီးပြီ ဆိုရင် ကျွန်တော်တို့တွေ website ကို အရင် ဆုံး pull လုပ်ကြည့်ပါမယ်။

cd /var/www/mywebsite
sudo -u www-data git init
sudo -u www-data git remote add origin git@gitlab.com:username/mywebsite.git
sudo -u www-data git pull origin master

www-data ဆိုတဲ့ user ကနေ git remote ထည့်ပြီး pull လုပ်ထားတာပါ။ pull လုပ်ပြီးပြီဆိုရင်တော့ gitlab.php ပါသလား ပြန်စစ်ပါ။

ပြီးရင်တော့ နောင်တချိန် git push လုပ်လိုက်တဲ့ အခါမှာ gitlab က webhook ကို ခေါ်ပါလိမ့်မယ်။ git push လုပ်လိုက်တဲ့ အပေါ်မှာ မူတည်ပြီးတော့ server က git pull လုပ်တာကို စောင့်ဖို့ လိုပါတယ်။

Debugging

တစ်ခါတစ်လေ permission မမှန်တာကြောင့် ဒါမှမဟုတ် SSH ကြောင့် git pull လုပ်လို့ မရတာ ရှိပါတယ်။ အဲဒီအတွက် ကျွန်တော်တို့တွေ gitlab.php ရဲ့ အပေါ်ဆုံးမှာ အောက်က code ထည့်ပြီး စစ်နိုင်ပါတယ်။

exec("/var/www/gitlab_wehook/mywebsite_com_hook.sh 2 > &1",$output);
var_dump($output);
exit();

ပြီးရင် browser ကနေ gitlab.php ကို တိုက်ရိုက် ခေါ်ကြည့်ပါ။ shell command က return ပြန်လာတဲ့ စာတွေ ဖတ်လို့ ရပါလိမ့်မယ်။ အဲဒီ အပေါ်မှာ မူတည်ပြီးတော့ ဘယ်နေရာမှာ ဘာပြင်ရမလဲ ဆိုတာကို သိနိုင်ပါတယ်။

One response to “Deploy website with gitlab webhook”

  1. ကျွန်တော်တောင်ရေးမလို့လုပ်နေတာအစ်ကိုအရင်ဦးသွားတယ် :D

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.