Cách triển khai Hugo Site sang Sản xuất với Git Hooks trên Ubuntu 14.04
Hugo là một trình tạo trang web tĩnh cho phép bạn dễ dàng tạo và xuất bản nội dung web bằng cách viết bằng các ngôn ngữ đánh dấu đơn giản. Hugo có thể phân tích cú pháp nội dung của bạn theo các yêu cầu được cung cấp và áp dụng một chủ đề để tạo các trang web nhất quán có thể dễ dàng được lưu trữ trên bất kỳ web server hoặc server lưu trữ nào. Trong hướng dẫn trước , ta đã trình bày cách cài đặt Hugo vào hệ thống Ubuntu 14.04 và sử dụng nó để tạo nội dung. Trong hướng dẫn này, ta sẽ chỉ cho bạn cách cài đặt hệ thống với git
mà bạn có thể sử dụng để tự động triển khai nội dung mới của bạn lên web server production của bạn.
Yêu cầu
Đối với hướng dẫn này, ta sẽ giả định bạn có một máy Ubuntu 14.04 và đang chạy như một máy phát triển của bạn như được nêu trong hướng dẫn cài đặt Hugo của ta .
Ta sẽ cài đặt một server Ubuntu 14.04 thứ hai để phục vụ trang web production thực tế của ta . Trên server này, hãy đảm bảo bạn đã tạo user không phải root với các quyền sudo
. Bạn có thể làm theo hướng dẫn cài đặt server ban đầu của ta để tạo account này.
Chuẩn bị server phát triển của bạn
Ta sẽ bắt đầu trên server phát triển của bạn ( server được cài đặt thông qua hướng dẫn Hugo trước đó). Đăng nhập vào server đó bằng chính account không phải root mà bạn đã sử dụng lần trước.
Ta cần thực hiện một số thao tác trên server này để cài đặt triển khai một bước. Ta cần phải:
- Cấu hình Quyền truy cập SSH key vào server production của ta
- Chuyển repository
git
ban đầu sang server production - Thêm server production làm điều khiển từ xa
git
trong repository lưu trữ trang web của ta
Bắt đầu nào.
Cấu hình quyền truy cập SSH key vào Server production
Điều đầu tiên ta sẽ làm là cấu hình truy cập SSH key giữa hai server của ta . Điều này sẽ cho phép ta triển khai mà không cần nhập password mỗi lần. Nếu bạn muốn được yêu cầu nhập password trên mỗi lần triển khai, bạn có thể bỏ qua bước này. Một số người thích giữ dấu nhắc password trong quá trình triển khai như một cơ hội nhỏ để xem xét lại trước khi đưa nội dung vào hoạt động.
Trước tiên, hãy kiểm tra xem bạn đã cấu hình cặp SSH key trong account của bạn trên server phát triển chưa:
- ls ~/.ssh/id_rsa
Nếu bạn nhận được một dòng giống như thế này, bạn chưa cấu hình cặp SSH key :
Outputls: cannot access /home/demouser/.ssh/id_rsa: No such file or directory
Bạn có thể tạo cặp khóa bị thiếu bằng lệnh :
- ssh-keygen
Nhấn ENTER qua tất cả các dấu nhắc để tạo khóa không cần password .
Mặt khác, nếu ls
cung cấp cho bạn một dòng giống như thế này, bạn đã có một khóa trong account của bạn :
Output/home/demouser/.ssh/id_rsa
Sau khi có một cặp khóa, bạn có thể chuyển public key của bạn sang server production bằng lệnh vào mã này. Trong lệnh, hãy thay thế tên account không phải root mà bạn đã cấu hình trên server production của bạn trong giai đoạn yêu cầu cho hướng dẫn này:
- ssh-copy-id username@production_domain_or_IP
Nếu đây là lần đầu tiên bạn sử dụng SSH giữa hai máy tính này, bạn cần xác nhận kết nối bằng lệnh “yes”. Sau đó, bạn sẽ được yêu cầu nhập password user cho server production . Khóa công khai của bạn sẽ được chuyển đến server production , cho phép bạn đăng nhập mà không cần password vào lần sau.
Kiểm tra chức năng này bằng cách yêu cầu tên server production của bạn bằng lệnh ssh
:
- ssh username@production_domain_or_IP cat /etc/hostname
Bạn sẽ không được yêu cầu nhập password lần này. Bạn sẽ nhận lại tên server cho server production của bạn :
Outputprodserver
Chuyển Repo Git ban đầu đến Server Sản xuất
Tiếp theo, ta cần chuyển một bản sao ban đầu của đại diện Hugo sang server production của ta . Ta cần điều này để cài đặt móc sau post-receive
trên server production sau này. Để thực hiện điều này, ta cần tạo một bản sao "trống" của git
repo và sao chép nó vào server khác của ta .
Kho lưu trữ trần là một repository git
đặc biệt không có folder làm việc. Trong các git
thông thường, các file dự án của bạn được giữ trong folder chính và dữ liệu lập version git
được giữ trong một thư .git
ẩn bên trong có tên .git
. Một repository trống không có folder làm việc cho các file dự án của bạn, vì vậy các file và folder thường được giữ trong .git
ẩn thay vào đó nằm trong folder chính. Các repo trần thường được sử dụng cho các server từ xa vì nó đơn giản hóa quá trình đẩy nội dung.
Ta sẽ tạo một repository trống từ repository Hugo chính của ta trong /tmp
. Các repo trần thường được xác định bằng hậu tố .git
cuối. Để tạo bản sao này, ta sẽ sử dụng git clone
với tùy chọn --bare
:
- git clone --bare ~/my-website /tmp/my-website.git
Ta có thể chuyển repository trống này sang server production của ta với scp
. Đảm bảo bao gồm dấu “:” ở cuối lệnh để repo sẽ được đặt trong folder chính của user của ta trên hệ thống từ xa.
- scp -r /tmp/my-website.git username@production_domain_or_IP:
Thêm Git Remote cho Server Sản xuất
Bây giờ ta đã có git
trần trên server production của bạn , ta có thể thêm server production làm repository từ xa được theo dõi. Điều này sẽ cho phép ta đẩy nội dung mới đến server production của bạn một cách dễ dàng.
Quay lại folder Hugo của bạn:
- cd ~/my-website
Tất cả những gì ta cần làm là quyết định đặt tên cho điều khiển từ xa. Trong hướng dẫn này, ta sẽ sử dụng prod
. Sau đó, ta có thể chỉ định thông tin kết nối và vị trí của repository trống của ta trên hệ thống từ xa:
- git remote add prod username@production_domain_or_IP:my-website.git
Bạn sẽ không thể kiểm tra liên kết từ xa này cho đến khi ta cài đặt git
trên server production của bạn .
Cài đặt Server Sản xuất
Bây giờ cỗ máy phát triển của ta đã được cấu hình hoàn chỉnh, ta có thể chuyển sang cài đặt hệ thống production của bạn .
Trên hệ thống production của ta , ta cần hoàn thành các bước sau:
- Cài đặt
git
,nginx
vàpygments
- Cài đặt Hugo và các chủ đề Hugo
- Cấu hình
nginx
để phân phát file từ một vị trí trong folder chính của ta - Tạo một tập lệnh
post-receive
để triển khai nội dung mới được đẩy vào repository của ta
Cài đặt Git, Py Phân khúc và Nginx trên Server Sản xuất
Điều đầu tiên ta nên làm là cài đặt git
, pygments
và nginx
vào server . Mặc dù repository dự án của ta đã có trên server của ta , nhưng ta cần phần mềm git
để nhận các lần đẩy và thực thi tập lệnh triển khai của ta . Ta cần các pygments
để áp dụng đánh dấu cú pháp phía server cho bất kỳ khối mã nào. Ta sẽ sử dụng nginx
làm web server để cung cấp nội dung của ta cho khách truy cập.
Cập nhật index gói local và cài đặt git
và nginx
từ repository mặc định của Ubuntu. Ta cần cài đặt pip
, trình quản lý gói Python, để lấy các pygments
:
- sudo apt-get update
- sudo apt-get install git nginx python-pip
Sau đó, ta có thể sử dụng pip
để cài đặt các pygments
:
- sudo pip install Pygments
Sau khi quá trình download hoàn tất, ta có thể kiểm tra xem ta đã cài đặt chính xác repository từ xa trên máy phát triển của bạn hay chưa. Trên máy phát triển của bạn, chuyển vào folder dự án Hugo của bạn và sử dụng git ls-remote
:
- cd ~/my-website
- git ls-remote prod
Nếu git
có thể cài đặt kết nối giữa các repository trên máy production và phát triển của bạn, nó sẽ hiển thị danh sách các tham chiếu, như sau:
Output103902f5d448cf57425bd6830e544128d9522c51 HEAD 103902f5d448cf57425bd6830e544128d9522c51 refs/heads/master
Cài đặt Hugo trên Server Sản xuất
Quay lại server production của ta , ta cần cài đặt Hugo. Thay vì xây dựng nội dung của ta trên server phát triển của ta , ta sẽ xây dựng các tài sản tĩnh trên server production sau mỗi lần git push
. Để làm điều này, ta cần cài đặt Hugo.
Ta có thể cài đặt Hugo bằng cùng một phương pháp mà ta đã sử dụng cho máy phát triển của bạn . Bắt đầu bằng cách kiểm tra kiến trúc của server production của bạn:
- uname -i
Tiếp theo, hãy truy cập trang phát hành Hugo . Cuộn xuống phần “ Download ” để biết version Hugo mới nhất. Nhấp chuột phải vào liên kết tương ứng với kiến trúc của bạn:
- Nếu
uname -i
tạo rax86_64
, hãy nhấp chuột phải và sao chép liên kết kết thúc bằngamd64.deb
- Nếu
uname -i
tạo rai686
, hãy nhấp chuột phải và sao chép liên kết kết thúc bằngi386.deb
Trên server production của bạn, hãy chuyển vào folder chính của bạn và sử dụng wget
để download liên kết bạn đã sao chép:
- cd ~
- wget https://github.com/spf13/hugo/releases/download/v0.14/hugo_0.14_amd64.deb
Sau khi quá trình download hoàn tất, bạn có thể cài đặt gói bằng lệnh :
- sudo dpkg -i hugo*.deb
Kiểm tra xem cài đặt có thành công không bằng cách yêu cầu Hugo hiển thị số version của nó:
- hugo version
Bạn sẽ thấy một dòng version được hiển thị, cho biết rằng Hugo hiện đã có sẵn:
OutputHugo Static Site Generator v0.14 BuildDate: 2015-05-25T21:29:16-04:00
Trước khi tiếp tục, ta cần sao chép các chủ đề Hugo vào server production của bạn :
- git clone --recursive https://github.com/spf13/hugoThemes ~/themes
Cấu hình Nginx để cung cấp các file được tạo trong quá trình triển khai
Tiếp theo, ta cần sửa đổi cấu hình Nginx của bạn một chút.
Để đơn giản hóa việc triển khai của ta , thay vì đặt nội dung đã tạo của ta vào folder var/www/html
, nội dung sẽ được đặt trong folder có tên public_html
trong folder chính của user của ta .
Hãy tiếp tục và tạo folder public_html
ngay bây giờ:
- mkdir ~/public_html
Tiếp theo, hãy mở file cấu hình khối server Nginx mặc định để thực hiện các điều chỉnh cần thiết:
- sudo nano /etc/nginx/sites-available/default
Các tùy chọn duy nhất mà ta cần thay đổi là server_name
, domain này sẽ trỏ đến domain hoặc địa chỉ IP của server production của bạn và chỉ thị root
, sẽ trỏ đến folder public_html
mà ta vừa tạo:
server { listen 80 default_server; listen [::]:80 default_server ipv6only=on; root /home/username/public_html; index index.html index.htm; # Make site accessible from http://localhost/ server_name server_domain_or_IP; . . .
Đảm bảo rằng bạn thay thế “tên user ” trong chỉ thị root
bằng tên user thực của bạn trên server production . Lưu file khi bạn hoàn tất.
Khởi động lại server Nginx để áp dụng các thay đổi :
- sudo service nginx restart
Web server của ta hiện đã sẵn sàng cung cấp các file mà ta đưa vào folder public_html
.
Tạo một móc nối sau khi nhận để triển khai trang Hugo
Bây giờ, ta cuối cùng đã sẵn sàng để tạo tập lệnh hook triển khai sau post-receive
của ta . Tập lệnh này sẽ được gọi khi nào bạn đẩy nội dung mới vào mã production .
Để tạo tập lệnh này, ta sẽ đi vào repository trống của ta trên server production của ta vào một folder có tên là hooks
. Chuyển vào folder đó ngay bây giờ:
- cd ~/my-website.git/hooks
Thư mục này có khá nhiều tập lệnh mẫu, nhưng ta cần một tập lệnh post-receive
cho hướng dẫn này. Tạo và mở file có tên này trong folder hooks
:
- nano post-receive
Ở đầu file , sau khi cho biết đây là một tập lệnh bash, ta sẽ bắt đầu bằng cách xác định một vài biến. Ta sẽ đặt GIT_REPO
thành repository trống của ta . Ta sẽ sao chép nó vào một repository tạm thời được chỉ định bởi biến WORKING_DIRECTORY
để Hugo có thể truy cập nội dung bên trong để xây dựng trang web thực tế. Vì folder chủ đề trong git
repo của ta thực sự chỉ là một softlink trỏ đến một vị trí trong folder mẹ, ta cần đảm bảo bản sao folder làm việc được tạo ở cùng vị trí với các chủ đề Hugo mà ta đã download .
Thư mục web công cộng sẽ được chỉ định bởi biến PUBLIC_WWW
và một folder web dự phòng sẽ được truy cập thông qua biến BACKUP_WWW
. Cuối cùng, ta sẽ đặt MY_DOMAIN
thành domain hoặc địa chỉ IP công cộng của server của ta :
Với ý nghĩ đó, phần đầu file của bạn sẽ trông giống như sau:
#!/bin/bash GIT_REPO=$HOME/my-website.git WORKING_DIRECTORY=$HOME/my-website-working PUBLIC_WWW=$HOME/public_html BACKUP_WWW=$HOME/backup_html MY_DOMAIN=server_domain_or_IP
Sau khi cài đặt các biến của ta , ta có thể bắt đầu dựa trên logic của tập lệnh của ta . Đầu tiên, ta sẽ sử dụng lệnh set -e
của bash để chỉ định rằng tập lệnh sẽ thoát ngay lập tức nếu nó gặp bất kỳ lỗi nào. Ta sẽ sử dụng điều này để dọn dẹp trong trường hợp có sự cố trong chốc lát.
Sau đó, hãy đảm bảo môi trường của ta được cài đặt để triển khai. Ta muốn xóa bất kỳ folder làm việc hiện có nào vì ta muốn sao chép một bản sao mới trong quá trình triển khai. Ta cũng muốn backup folder web của bạn để ta có thể khôi phục nếu có gì sai. Ta sử dụng rsync
ở đây vì nó xử lý các folder trống và folder có nội dung trong đó nhất quán hơn cp
. Đảm bảo rằng bạn bao gồm dấu /
sau $PUBLIC_WWW
để caommand được phân tích cú pháp chính xác.
Một quy trình cài đặt cuối cùng mà ta sẽ làm là đặt lệnh trap
để phản hồi trong trường hợp nhận được tín hiệu “thoát”. Vì ta đã bao gồm lệnh set -e
, một tín hiệu thoát sẽ xảy ra khi nào một lệnh trong triển khai của ta bị lỗi. Trong trường hợp này, các lệnh được chỉ định bởi bẫy sẽ khôi phục bản backup của ta vào folder web và xóa bất kỳ version nào của folder git
đang hoạt động.
#!/bin/bash GIT_REPO=$HOME/my-website.git WORKING_DIRECTORY=$HOME/my-website-working PUBLIC_WWW=$HOME/public_html BACKUP_WWW=$HOME/backup_html MY_DOMAIN=server_domain_or_IP set -e rm -rf $WORKING_DIRECTORY rsync -aqz $PUBLIC_WWW/ $BACKUP_WWW trap "echo 'A problem occurred. Reverting to backup.'; rsync -aqz --del $BACKUP_WWW/ $PUBLIC_WWW; rm -rf $WORKING_DIRECTORY" EXIT
Bây giờ, ta có thể bắt đầu triển khai. Ta sẽ tạo một bản sao thông thường của repo trần của ta để Hugo có thể truy cập nội dung repo. Sau đó, ta sẽ xóa tất cả nội dung khỏi folder web công cộng để chỉ các file mới có sẵn trong folder web công cộng. Sau đó, ta sẽ sử dụng Hugo để xây dựng trang web của bạn . Ta sẽ trỏ nó đến bản sao mới của ta làm folder nguồn và yêu cầu nó đặt nội dung đã tạo trong folder web công cộng. Ta cũng sẽ chuyển cho nó biến chứa domain hoặc địa chỉ IP của server production của ta để nó có thể tạo liên kết một cách chính xác.
Sau khi Hugo xây dựng nội dung, ta sẽ xóa folder làm việc. Sau đó, ta sẽ đặt lại lệnh trap
để bản backup của ta không overrides ngay nội dung mới của ta khi tập lệnh cố gắng thoát:
#!/bin/bash GIT_REPO=$HOME/my-website.git WORKING_DIRECTORY=$HOME/my-website-working PUBLIC_WWW=$HOME/public_html BACKUP_WWW=$HOME/backup_html MY_DOMAIN=server_domain_or_IP set -e rm -rf $WORKING_DIRECTORY rsync -aqz $PUBLIC_WWW/ $BACKUP_WWW trap "echo 'A problem occurred. Reverting to backup.'; rsync -aqz --del $BACKUP_WWW/ $PUBLIC_WWW; rm -rf $WORKING_DIRECTORY" EXIT git clone $GIT_REPO $WORKING_DIRECTORY rm -rf $PUBLIC_WWW/* /usr/bin/hugo -s $WORKING_DIRECTORY -d $PUBLIC_WWW -b "http://${MY_DOMAIN}" rm -rf $WORKING_DIRECTORY trap - EXIT
Đến đây, kịch bản của ta đã hoàn thành. Lưu file khi bạn hoàn tất.
Tất cả những gì ta phải làm bây giờ là làm cho tập git
có thể thực thi được để git
có thể gọi nó vào thời điểm thích hợp:
- chmod +x post-receive
Hệ thống triển khai của ta hiện đã hoàn tất. Hãy kiểm tra nó ra.
Kiểm tra Hệ thống Triển khai
Bây giờ ta đã cài đặt hệ thống của bạn , ta có thể tiếp tục và kiểm tra nó.
Hãy bắt đầu bằng cách thử nghiệm tập lệnh hook post-receive
của ta . Điều này sẽ cho phép ta đưa vào folder ~/public_html
một bản sao ban đầu của nội dung web của ta . Nó cũng sẽ giúp xác minh các thành phần chính của tập lệnh đang hoạt động như mong đợi:
- bash ~/my-website.git/hooks/post-receive
Thao tác này sẽ chạy tập lệnh của bạn và xuất các thông báo git
và Hugo bình thường ra màn hình:
OutputCloning into '/home/justin/my-website-working'... done. 0 draft content 0 future content 4 pages created 0 paginator pages created 0 tags created 1 categories created in 26 ms
Nếu bạn truy cập domain hoặc địa chỉ IP của server production trong trình duyệt web của bạn , bạn sẽ thấy version hiện tại của trang web của bạn :
http://production_domain_or_IP
Bây giờ, ta có thể quay lại máy ta đang sử dụng để phát triển Hugo. Trên máy đó, hãy tạo một bài đăng mới:
- hugo new post/Testing-Deployment.md
Trong bài đăng mới, chỉ cần đưa một chút nội dung để ta có thể kiểm tra hệ thống của bạn :
+++ categories = ["misc"] date = "2015-11-11T16:24:33-05:00" title = "Testing Deployment" +++ ## A Test of the New Deployment System I hope this works!
Bây giờ, thêm nội dung vào git
và commit các thay đổi :
- git add .
- git commit -m 'Deployment test'
Bây giờ, nếu mọi thứ diễn ra theo đúng kế hoạch, ta có thể áp dụng các thay đổi mới của bạn chỉ bằng cách đẩy đến server production của ta :
- git push prod master
Bây giờ, nếu bạn truy cập lại trang web production của bạn trong trình duyệt web, bạn sẽ thấy nội dung mới:
http://production_domain_or_IP
Hệ thống triển khai của ta dường như đang chạy chính xác.
Kết luận
Trong hướng dẫn này, ta cài đặt một server production riêng để phục vụ nội dung web của ta cho khách truy cập. Trên server này, ta đã cài đặt và cấu hình nhiều thành phần để Hugo có thể xây dựng và phân phát nội dung của ta một cách chính xác. Sau đó, ta tạo một tập lệnh triển khai được kích hoạt bất kỳ lúc nào ta đẩy nội dung mới đến server từ máy phát triển của ta .
Các cơ chế thực tế liên quan đến hệ thống triển khai của ta khá cơ bản. Tuy nhiên, chúng tạo cơ sở cho một hệ thống dễ bảo trì để đưa nội dung local của bạn lên web server của bạn một cách nhanh chóng và dễ dàng. Bởi vì quá trình triển khai được tự động hóa, bạn sẽ không phải tương tác với server của bạn để áp dụng các thay đổi ngoài một git push
đơn giản.
Các tin liên quan
Cách cài đặt và sử dụng Hugo, Trình tạo trang web tĩnh, trên Ubuntu 14.042015-11-09
Cách tạo thiết lập HAProxy khả dụng cao với Corosync, Pacemaker và IP nổi trên Ubuntu 14.04
2015-11-05
Cách cài đặt Elasticsearch 1.7, Logstash 1.5 và Kibana 4.1 (ELK Stack) trên Ubuntu 14.04
2015-11-04
Cách cài đặt và cấu hình Elasticsearch trên Ubuntu 14.04
2015-10-26
Cách thiết lập server HAProxy khả dụng cao với các IP được lưu giữ và nổi trên Ubuntu 14.04
2015-10-23
Cách cài đặt Cassandra và chạy một cụm node đơn trên Ubuntu 14.04
2015-10-21
Cách tạo thiết lập tính khả dụng cao với Corosync, Pacemaker và IP nổi trên Ubuntu 14.04
2015-10-20
Cách tạo thiết lập tính khả dụng cao với Heartbeat và IP nổi trên Ubuntu 14.04
2015-10-20
Cách cài đặt và cấu hình server Salt Master và Minion trên Ubuntu 14.04
2015-10-05
Cách cài đặt và bắt đầu với Symfony 2 trên Ubuntu 14.04
2015-10-01