Tìm hiểu về Environment Varialbles

Như thường lệ, câu hỏi đầu tiên đặt ra: Environment Variables là gì?

Hiện nay, có rất nhiều ứng dụng đòi hỏi các thông tin liên quan đến tài khoản email hay là các API key cho các services sử dụng thêm ở ngoài ứng dụng. Các bạn có thể thiết lập cấu hình trên local để ứng dụng mà mình phát triển sử dụng các biến môi trường (environment variables).

Giờ đây, các hệ điều hành (Linux, Mac OS X, Windows) đã cung cấp cơ chế để thiết lập các biến môi trường trên local cho developer, cũng giống như heroku và các development platforms khác.

Vậy tại sao chúng ta cần thiết lập các biến môi trường ???

Suy nghĩ một chút, sẽ rất dễ dàng để hiểu lý do. Hiện tại, các developer đang sử dụng github như một công cụ hữu ích để quản lý code của dự án. Các thao tác trên git giúp người quản lý có thể dễ dàng kiểm soát tiến trình của dự án đang đến đâu để lên kế hoạch, hoặc dễ dàng chia sẻ code với những thành viên mới gia nhập nhóm phát triển (lợi ích của git mình xin chia sẻ ở một bài post khác). Tuy nhiên, chính vì việc dễ dàng chia sẻ với thành viên mới cũng chính là việc những người khác không mong muốn có thể đọc được hết code của bạn, ngay cả các thông tin về tài khoản email hay các API key của riêng bạn nữa.

Để khắc phục vấn đề này, chúng ta sử dụng các biến mỗi trường được thiết lập trên mỗi máy là khác nhau để bạn có thể sử dụng tài khoản cá nhân mà không cần chia sẻ các thông tin đó.

Để dễ hình dung hơn, mình xin đưa ra 1 ví dụ về gmail

Có thể thấy có rất nhiều các ứng dụng sử dụng gmail để gửi các thông điệp như reset password, active tài khoản, ... Để làm được việc này bạn cần 1 tài khoản gmail để gửi tất cả các thông điệp bạn muốn, và khi đang phát triển app thì chắc chắn đó chính là gmail của bạn rồi. Trong rails, bạn cần phải cấu hình các thông tin này trong file config/environments/production.rb. Nó có thể trông giống như:

config.action_mailer.smtp_settings = {
  address: "smtp.gmail.com",
  port: 587,
  domain: "example.com",
  authentication: "plain",
  enable_starttls_auto: true,
  user_name: ENV["GMAIL_USERNAME"],
  password: ENV["GMAIL_PASSWORD"]
}

Bạn có thể thêm thẳng user_name và password vào file tuy nhiên điều này sẽ làm cho tất cả các developer khác có thể thấy được các thông tin đó.

Thay vào đó, chúng ta sử dụng biến ENV["GMAIL_USERNAME"] để có được 1 môi trường biến. Các biến dạng như thể này có thể sử dụng ở bất kỳ đâu trong 1 ứng dụng của rails. Ruby sẽ tự động thay thế ENV["GMAIL_USERNAME"] với 1 biến môi trường.

Giờ, làm cách nào để thiết lập các biến môi trường?

Có nhiều cách để bạn có thể thiết lâp:

  • Cách 1: Thiết lập biến môi trường cho hệ điều hành.

Nếu bạn sử dụng ubuntu, biến môi trường mặc đinh được đặt trong file ~/.bashrc. Nếu bạn sử dụng zsh thay cho bash thì sẽ là ~/.zshrc. Sau khi tìm được file này, bạn mở lên bằng text editor của mình và thêm dòng:

export GMAIL_USERNAME="[email protected]"

Tương tự với các biến khác bạn muốn thêm nhé.

Khi deploy lên heroku bạn cũng cần phải thiết lập các biến môi trường bằng cách chạy dòng lệnh trên terminal như sau:

 heroku config:add [email protected]

Bạn có thể kiểm tra lại mọi như đã thêm vào chính xác chưa bằng cách chạy lệnh:

 heroku info --app myapp
  • Cách 2: Sử dụng gem figaro (Cách này mình cũng chỉ mới tìm hiểu nên có thể chưa hiểu rõ lắm).

Gem này sử dụng các lợi thế về khả năng của ruby để thiết lập các biến môi trường cũng như là đọc chúng. Ứng dụng của gem là đọc file config/application.yml và thiết lập các biến môi trường trước khi bất cứ điều gì khác được thiết lập trong ứng dụng của rails.

Một lợi thế khi sử dụng gem này là tùy vào môi trường của ứng dụng (ví dụ như: development, test, production, ..) gem này sẽ cho phép bạn chỉ định các thông tin khác nhau trong file config/application.yml. Hơn thế nữa, nếu bạn deploy lên heroku, gem figaro sẽ chạy giống như các rake task để thiết lập tất cả các biến môi trường trong heroku.

Và còn vài tính năng nữa nhưng mình chưa sử dụng đến nên không quan tâm lắm.

Nào, giờ làm sao để sử dụng gem figaro. Như bất kỳ gem nào, đầu tiên chúng ta thêm vào gemfile và bundle install:

gem "figaro"

Sau đó:

bundle exec figaro install

Việc khởi tạo sẽ tạo ra file config/application.yml và thêm vào .gitignore để tránh sự kiểm soát của git

Bạn có thể thêm các biến môi trường như cặp khóa / giá trị vào config/application.yml như sau:

GMAIL_USERNAME: Your_Username

Giờ thì các biến môi trường sẽ có sẵn ở bất kỳ đâu dưới dạng các biến ENV:

ENV["GMAIL_USERNAME"]

Trong các trường hợp test bạn cũng có thể gọi đến chúng bằng cách gọi đến method Figaro ví dụ như:

Figaro.env.gmail_username

Bạn có thể sử dụng cú pháp này để thiết lập thông tin trong các môi trường khác nhau:

HELLO: world
development:
  HELLO: developers
production:
  HELLO: users

Dễ hơn cách thứ nhất, khi deploy lên heroku bạn chỉ cần chạy:

rake figaro:heroku

Trên đây là bài giới thiệu về Environment Variables và một số cách để thiết lập. Bài viết còn nhiều thiếu sót mong các bạn góp ý để mọi người biết thêm và đúng hơn về biến môi trường.

Xin chân thành cảm ơn mọi người đã theo dõi bài viết.