Deploy laravel project with jenkin

  • July 26, 2024
  • 349

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.

1. Setup laravel server

Đầ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.

2. Setup jenkin server

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.

2.1 Install jenkin

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

2.2 Setup jenkin

Đă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

2.3 Create jenkin item

Đă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.
create jenkin item

2.4 Config jenkin

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.
connect to github
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.
Jenkin credentials
Từ jenkin kiểm trả connect được với github là được.

2.5 Config branch deploy

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.
deploy branch
Thiết lập auto deploy khi merge code vào branch develop

auto deploy
Thêm webhook trên tài khoản github để trigger đến jenkin khi có code được merge vào nhánh develop.

config auto deploy
Caption


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.

3. Setup build step

3.1 Setup basic build

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.
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.

3.2 Setup advanced build

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.

3.3 Build mutil branch

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.

multi deploy
Caption

Config deploy theo branch được chọn từ jenkin.
deploy multi branch

Config build step


#!/bin/bash
ssh demo-api-1 << EOF
bash /home/user/scripts/deploy.sh ${branch}
EOF

3.4 Build mutil server

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.
deploy multi server

Tổng kết

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...