Hôm nay chúng ta sẽ cùng tìm hiểu các bước để deploy một dự án viết bằng laravel sử dụng jenkin nhé. Chúng ta cần thiết lập 2 server(vps, ec2...) một server chạy ứng dụng laravel và 1 server thiết lập jenkins làm nhiệp vụ auto deploy.
Đầu tiên chúng ta cần cài đặt một server để chạy laravel application. Hãy tham khảo bài viết how to deploy laravel to vps using centos 9, tuỳ cấu hình server dùng linux, contos ... các command cài đặt có thể khác nhau, nhưng các dịch vụ thì đều giống nhau.
Sau khi đã thiết lập được server chạy ứng dụng laravel chúng ta sẽ cài đặt server jenkin để auto deploy dự án của mình.
Cài đặt jenkin trên server linux
# Install jenkins
sudo apt update
sudo apt install openjdk-8-jdk
wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
sudo sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ > \
/etc/apt/sources.list.d/jenkins.list'
sudo apt update
sudo apt install jenkins
Đăng nhập vào tài khoản jenkins, thêm ssh key để từ server jenkin có thể ssh được sang server chạy ứng dụng laravel
# SSH to jenkins server
# Switch current user to root
sudo su
# Switch root user to jenkins user
su jenkins
# Setup ssh từ server jenkins đến server api
ssh-keygen
# Upload file to server jenkins
scp key.pen :
# Copy key pem server api to server jenkins
cp key.pem ~/.ssh
# Chmod ssh key pem
chmod 600 ~/.ssh/key.pem
# Setup ssh config to api server
## content
Host demo-api-1
HostName 100.10.11.101
User ubuntu
Port 22
IdentityFile ~/.ssh/key.pem
## end content
Đăng nhập vào trang quản trị của jenkin, tạo jenkin item tưng ứng với project của bạn. Tạo mới mội jenkin item loại freestyle project.
Thiết lập để jenkin có thể quản lý được code của bạn trên github, connect với github sử dụng ssh.
Tạo credential loại ssh, thêm private key của jenkin server vào credential và thêm publish key của jenkin server vào tài khoản github.
Từ jenkin kiểm trả connect được với github là được.
Thiết lập nhánh deploy và trigger khi code được merge vào nhánh deploy thì jenkin sẽ tự động deploy. VD: config nhánh deploy là develop.
Thiết lập auto deploy khi merge code vào branch develop
Thêm webhook trên tài khoản github để trigger đến jenkin khi có code được merge vào nhánh develop.
Như vậy là mỗi khi merge code vào nhánh develop sẽ có trigger cho jenkin và jenkin sẽ tự động deploy code lên server.
Thiết lập build step cho jenkin. Khi có code được merge vào nhánh develop jenkin nhận được trigger và sẽ thực hiện các step build được thiết lập trong build steps.
Như config trên thì jenkin sẽ deploy bằng cách ssh vào server chứa code laravel, truy cập vào thư mục chứa code, pull code về nhánh develop, rồi thực hiện cài packagist, clear config và migrate database.
Ngoài build theo các step đơn giản như trên chúng ta cũng có thể viết scripts để deploy. Tạo script deploy vào file deploy.sh
#!/bin/bash
# exit when any command fails
set -e
repo=git@github.com:demo.git
path=/var/www/app/demo
date=`date +"%Y%m%d%H%M%S"`
release=$path/releases/$date
branch=develop
cd $path
echo "Deployment $date started"
git clone $repo --branch=$branch --depth=1 -q $release
echo "Repository cloned"
cd $path
rm -rf $release/storage
ln -s $path/share/storage $release/storage
echo "Storage directories set up"
ln -s $path/share/.env $release/.env
echo "Environment file set up"
echo "Installing composer dependencies...."
cd $release
composer install --no-interaction --prefer-dist --optimize-autoloader
php $release/artisan view:clear --quiet
php $release/artisan cache:clear --quiet
php $release/artisan config:cache --quiet
echo "Cache cleared"
php $release/artisan migrate --force
composer dump
echo "Run test"
sudo chmod -R 777 $release/storage/logs
#php $release/artisan test
#php $release/artisan test -d memory_limit=512M --coverage-html public/test-coverage
#sudo chmod -R 777 $release/storage/logs
ln -nfs $release $path/current
echo "Deployment ($date) finished"
echo "Reload services: php-fpm"
sudo systemctl reload php-fpm
echo "Reload services: nginx"
sudo systemctl reload nginx
cd $path/releases
find . -maxdepth 1 -name "20*" | sort | head -n -1 | xargs rm -Rf
echo "Cleaned up old deployments"
Chạy thử script deploy với command
bash /home/user/scripts/deploy.sh
Code được build trong thư mục demo và mỗi một lần deploy sẽ tạo ra một phiên bản release
, các thư mục dùng chung sẽ được tạo trong thư mục share
như storage, file .env. Khi release xong phiên bản cũ sẽ bị xoá đi, và link phiên bản mới vào thự mục current
nơi code chính được chạy.
Thiết lập jenkin build step sử dụng script deploy
#!/bin/bash
ssh demo-api-1 << EOF
bash /home/user/scripts/deploy.sh
EOF
Với step build như trên jenkin sẽ ssh vào server api và chạy script deploy trong file deploy.sh.
script deploy nhiều nhánh trên một server.
#!/bin/bash
# exit when any command fails
set -e
branch=$1
repo=git@github.com:huunv/demo-api.git
path=/var/www/$branch
date=`date +"%Y%m%d%H%M%S"`
release=$path/releases/$date
if [ ! -d $path ]
then
mkdir -p $path/releases
mkdir -p $path/share
fi
cd $path
echo "Deployment $date started"
git clone $repo --branch=$branch --depth=1 -q $release
echo "Repository cloned"
if [ ! -d "$path/share/storage" ]
then
mv $release/storage $path/share/storage
cp $release/.env.example $path/share/.env
fi
cd $path
rm -rf $release/storage
ln -s $path/share/storage $release/storage
echo "Storage directories set up"
ln -s $path/share/.env $release/.env
echo "Environment file set up"
echo "Installing composer dependencies...."
cd $release
composer install --no-interaction --prefer-dist --optimize-autoloader
php $release/artisan view:clear --quiet
php $release/artisan cache:clear --quiet
php $release/artisan config:cache --quiet
echo "Cache cleared"
php $release/artisan migrate --force
#php $release/artisan test --coverage-html public/test-coverage
composer dump
sudo chmod -R 777 $release/storage/logs
ln -nfs $release $path/current
echo "Deployment ($date) finished"
echo "Reload services: php-fpm"
sudo systemctl reload php-fpm
echo "Reload services: nginx"
sudo systemctl reload nginx
cd $path/releases
find . -maxdepth 1 -name "20*" | sort | head -n -1 | xargs rm -Rf
echo "Cleaned up old deployments"
Script này giúp chúng ta deploy nhiều branch khác nhau, branch là biến được chọn từ jenkin.
Config deploy theo branch được chọn từ jenkin.
Config build step
#!/bin/bash
ssh demo-api-1 << EOF
bash /home/user/scripts/deploy.sh ${branch}
EOF
Chúng ta cũng có thể config để deploy nhiều server cùng một lúc bằng các tạo 1 project sau đó thiết lập trigger build đến các project khác. Thiết lập này thường dùng khi deploy production với nhiều server.
Như vậy là chúng ta đã thiết lập được auto deploy cho dự án laravel sử dụng jenkin. Hi vọng bài viết giúp ích cho mọi người. Thank for reading...