[Basic] Xây dựng môi trường phát triển ở local với Vagrant

Trải qua thời gian dài với sự phát triển trong các kỹ thuật lập trình, giờ đây các lập trình viên được tiếp xúc với rất nhiều language/framework hay và nhanh chóng nắm bắt để phát triển một ứng dụng.

Tuy nhiên để có một môi trường phát triển tốt, một trong những thứ tưởng như đơn giản nhưng cũng lắm nhiêu khê. Chính vì vậy mình quyết định lục lại một số cái tuy đã cũ mà vẫn còn hiệu quả để chia sẻ cho các bạn.

Tình trạng nội bộ

Mình có làm khảo sát nhỏ tại công ty dành cho các bạn lập trình viên thì có thấy kết quả như sau:

  • 76% các bạn sử dụng ngôn ngữ PHP (và các PHP Framework)
  • Khi xây dựng môi trường phát triển ở local (trên chính máy đó)
    • 20% cài thẳng các package lên máy (thường ở các bạn dùng Linux)
    • 64% sử dụng các phần mềm hỗ trợ tạo môi trường như XAMPP, WAMP... (ở các bạn dùng Windows)

Từ kết quả trên có thể thấy việc tạo môi trường local để phát triển, cụ thể ở đây là các bạn phát triển ứng dụng web bằng PHP dùng các công cụ phổ biến như từ lâu đời như XAMPP. Vậy thực sự nó có tốt hay không?

Ưu nhược điểm

Một trong những ưu điểm dễ thấy đó là việc cài thẳng lên máy, hoặc dùng các phần mềm tạo server (như XAMPP) thì rất tiện, vài click là ngay lập tức môi trường sẽ có và có thể lập trình ngay >> chính vì lí do này các bạn lập trình viên rất thích xài vì nó đáp ứng tốt ngay ở thời điểm hiện tại.

Tuy nhiên, sẽ có những nhược điểm phát sinh trong quá trình sử dụng:

  • Đối với việc cài thẳng, các package sẽ được cài sâu vào hệ thống và sau quá trình phát triển sẽ để lại rất nhiều temp folder/files. Đặc biệt nếu muốn cài các phiên bản khác nhau của 1 package nào đó (ví dụ MySQL Server) thì rất dễ conflict, khó cài.

  • Các phần mềm tạo server thì về cách thức vận hành, các phần mềm này sẽ chạy phiên bản PHP trên Windows, thiết lập sẵn các config (cùng dành cho phiên bản của Windows).

    • Trên thực tế các dự án sẽ ko chạy trên môi trường Windows Server mà là Linux nên rất dễ xảy ra lỗi không đồng bộ khi triển khai lên production.
    • Giới hạn với một vài DB cơ bản, gặp đặc thù thì không có.
    • Việc cài nhiều phiên bản cũng không dễ.
    • Cũng vẫn khá là rác máy.

Giải pháp?

Ở thời điểm hiện tại có lẽ mọi người đều nghe nhà nhà Docker, người người Docker. Nhưng đối với mình, một giải pháp đã khá cũ nhưng không hề khó tiếp cận, lại dễ xử lý trong nhiều tình huống hơn đó chính là "Vagrant".

Vậy Vagrant là gì?

Vagrant is a tool for building and managing virtual machine environments in a single workflow. With an easy-to-use workflow and focus on automation, Vagrant lowers development environment setup time, increases production parity, and makes the "works on my machine" excuse a relic of the past.

Cái này là mình copy từ trang chủ của Vagrant (https://vagrantup.com), đại loại vagrant sẽ giúp bạn "xây và quản lý" môi trường phát triển máy ảo một cách tự động >> giúp bạn tối thiểu hoá thời gian xây dựng môi trường + đồng bộ toàn bộ team phát triển với nhau.

Thử nghiệm

Về cơ bản, Vagrant giúp bạn thiết lập/quản lý một máy ảo, vì vậy bạn cần cài đặt các phần mềm ảo hoá, miễn phí và dễ nhất chính là VirtualBox, tất nhiên là cài cả Vagrant.

Sau khi cài xong bạn có thể sử dụng cậu lệnh vagrant để bắt đầu làm việc.

Mình có chuẩn bị sẵn 1 repo thiết lập một môi trường hoàn chỉnh tại đây:
https://github.com/hoantran-pirago/vagrant-demo

Chỉ cần clone về và làm theo hướng dẫn trong README.md là bạn sẽ có ngay một môi trường PHP hoàn chỉnh dành cho Laravel Framework.

Chi tiết

Hãy tìm hiểu file Vagrantfile nhé:

Vagrant.configure("2") do |config|
  # Sử dụng Ubuntu 20.04 LTS
  config.vm.box = "ubuntu/focal64"
  config.vm.hostname = "demo"

  # Forward port 80 ra máy hiện tại, lúc này bạn có thể sử dụng link: http://localhost:4221 để truy cập
  config.vm.network "forwarded_port", guest: 80, host: 4221

  # Mount các folder từ máy thật vào máy ảo, app ở đây là project Laravel
  config.vm.synced_folder "../app", "/var/www/app", type: "virtualbox"
  config.vm.synced_folder ".", "/vagrant", type: "virtualbox"

  # Tự động tạo 1 máy ảo bằng Virtualbox với các thông số tương ứng
  config.vm.provider "virtualbox" do |vb|
    vb.name = "Demo Example"
    vb.cpus = 4
    vb.memory = "1536"
  end

  # Khởi chạy các đoạn script giúp cài đặt môi trường phát triển
  config.vm.provision "shell", path: "provisions/common.sh"
  config.vm.provision "shell", path: "provisions/nginx.sh"
  config.vm.provision "shell", path: "provisions/php.sh"
end

Sau khi gõ lệnh vagrant up và đợi tiến trình cài đặt xong, vagrant sẽ tạo ra một máy ảo chạy Ubuntu native cho bạn, giống như là bạn đang có một con VPS ở local vậy. Bạn có thể truy cập vào bên trong VM bằng câu lệnh vagrant ssh.

Vì là một VM nên môi trường hoàn toàn tách biệt với máy thật của bạn, khi truy cập vào bên trong VM, bạn hoàn toàn tự do cài thêm package cần thiết, version bạn mong muốn. Thông thường môi dự án mình sẽ tạo các môi trường riêng nên không hề sợ bị conflict với dự án khác.

Các phần cài đặt bạn có thể script hoá thông qua shell script, hoặc các công cụ nâng cao như Ansible để đồng bộ hoá môi trường phát triển tới các máy khác cũng như các thành viên khác trong team nếu có nhiều người.

Tất cả mọi người chỉ cần pull về và chạy câu lệnh: vagrant up.

Tada, môi trường y hệt lại còn chả phải cài gì nhiều :D.

Kết luận

Bài viết tuy chỉ mang tính giới thiệu lại một công cụ đã cũ là Vagrant, nhưng có thể hiện tại nó vẫn rất hữu ích đối những project truyền thống. Giảm thiểu công sức thiết lập cũng như đồng bộ hoá môi trường phát triển local > trong team > tới lúc triển khai lên production.

Đặc biệt Vagrant vẫn là cách tiếp cận dễ hơn so với Docker và các công nghệ container khác, chính vì vậy hãy sử dụng để việc phát triển hiệu quả hơn nhé!