Tự động deploy code lên production server (Linux)

Nếu bạn đang quản lý một server Linux, bạn dùng Git để quản lý source code và thường xuyên phải làm nhiệm vụ đưa code lên production server, thì thật tuyệt vời bài viết này sẽ hướng dẫn các bạn tạo một bash script tự động lấy code từ branch master đưa vào production cho bạn và bạn không cần phải sử dụng Firezilla để deploy code theo thủ công như trước nữa.

Trong Git có một khái niệm là Hooks và bên trong Hooks chứa các bash script ứng với mỗi hành động, ví dụ bạn thực hiện lệnh commit thì trong Hooks sẽ thực thi file commit-msg, tương tự như vậy cho các hành động khác, mình nói sơ qua như vậy cho các bạn hình dung trước nhé, vì lát nữa mình sẽ vào mục này để tạo script thực thi trong này, OK bắt đầu thôi.

Bước 1

Đầu tiên các bạn đăng nhập vào server, giả sử domain của bạn đang trỏ vào thư mục your-project ở thư mục Home (Home/your-project) và source code đang chạy ở production ở đây, bạn cd vào thư mục your-project và chạy lệnh sau.

 

mkdir site.git && cd site.git

Lệnh ở trên có nghĩa là bạn tạo thư mục site.git và di chuyển vào trong thư mục đó, tiếp theo:

git init --bare

Lệnh này để khởi tạo repository, tức là để quản lý source code của bạn. Nếu bạn dừng ở bước này thì coi như bạn đã tạo git thành công trên server, bạn chỉ cần add địa chỉ của repo này vào git trên local của bạn thì bạn có thể quản lý source code được rồi, nhưng chỉ là quản lý thôi nhé, nó chưa lấy code từ repo vào production cho bạn đâu.

Bước 2

Tiếp theo bạn di chuyển vào thư mục hooks trong site.git và tạo file khi có hành động push code file này sẽ được gọi:

cd hooks && sudo nano post-receive

Lệnh ở trên có nghĩa là bạn di chuyển vào thư mục hooks rồi tạo file tên là post-receive và edit nội dung file đó bằng lệnh nano, xong bạn thêm vào file nội dung như sau:

#!/bin/bash
while read oldrev newrev ref
do
    if [[ $ref =~ .*/master$ ]];
    then
        printf "\n ------------------------------------------------------- \n"
        printf "| Push from: \e[32mThe Phuc\e[0m(\e[31mdeveloper\e[0m) |\n"
        printf "| \e[35mDeploying master branch to production...\e[0m | \n"
        printf " ------------------------------------------------------- \n"
        git --work-tree=/home/your-project --git-dir=/home/your-project/site.git checkout -f
    else
        printf "Ref $ref successfully received. Doing nothing: only the master branch may be deployed on this server."
fi
done

Đầu tiên mình chạy vòng while và đọc các biến của lệnh git, ví dụ bạn chạy lệnh git push production master thì mình sẽ lấy được các thông tin từ câu lệnh của bạn để kiểm tra xem hành động của bạn là gì và bạn đang thao tác trên branch nào.

Bước 3

Tiếp theo là điều kiện kiểm tra xem bạn có thực hiện lệnh bằng branch master hay không, nếu là nhánh master thì mới lấy code đưa vào production còn không thì thôi thông báo cái câu bên dưới lệnh else rồi nghỉ phẻ ^^ vì đưa code vào production phải là code chuẩn men nhất hoàn chỉnh nhất, nên phải lấy trong master nhé, nếu trường hợp đây là staging server thì bạn đổi lại lên nhánh ngay điều kiện if là được.

OK vào nội dung nếu vào được trong vòng if bắt đầu mổ sẻ nào:

mấy cái dòng printf chủ yếu là nội dung trả về từ repo trên server thôi ví dụ khi bạn dùng git đẩy code từ local lên git thì thường có cái thông báo mặc định từ server thì lúc này bạn có thể thay đổi lại theo ý của bạn, nhìn cho nó profession hơn ^^.

Lệnh quan trọng nhất bên trong đó là:

git --work-tree=/home/your-project --git-dir=/home/your-project/site.git checkout -f

Ở —work-tree là đường dẫn đến project của bạn, còn —git-dir là đường dẫn đến repository của bạn.

Tóm tắt lại ý nghĩa của đoạn script này là khi server nhận được thông báo là bạn đang push code lên từ local lên server thì file post-receive sẽ được thực thi, nó sẽ đọc để lấy các nội dung cần thiết từ câu lệnh của bạn -> rồi kiểm tra xem bạn có đang thực hiện trên nhánh master hay không nếu thỏa điều kiện thì nó sẽ checkout vào repo ở đường dẫn /home/your-project/site.git để lấy nội dung thay đổi ở trong repo và đưa code vào /home/your-project.

Có nhiêu đó thôi, bước cuối cùng là bạn add remote repo này vào project trên local của bạn qua lệnh sau

git remote add production  ssh://user-name@host/home/your-project/site.git

Lệnh trên bạn chỉ cần thay user-namehost mà bạn đăng nhập vào server là được, xong bạn thử push code lên và xem kết quả, nếu thấy kết quả thế này là bạn thành công rồi đó

selection_001

Chúc các bạn thành công!

Thông tin liên hệ

    • 1

      Step 1

    • 2

      Step 2

    • 3

      Step 3

    1/3

    Step 1

    This will close in 0 seconds

    <div class="content-form-widget">
    <p style="color: #003DA5;">Nhận Báo Giá</p>
    <p style="font-size: 87.5%">InDMP sẽ trả lời mail của bạn trong thời gian sớm nhất</p>
    </div>

      This will close in 20 seconds