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  gitban đầu sang server production
-  Thêm  server  production  làm điều khiển từ xa gittrong 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,nginxvà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 -itạ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 -itạ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
 

