Quy trình phát triển và vận hành phần mềm hay hệ thống (DevOps) thường được chia làm nhiều giai đoạn phát triển như dev, test, product,… Để đảm bảo quá trình phát triển và vận hành không bị gián đoạn, ta nên chia làm nhiều môi trường để vận hành sản phẩm. Ví dụ ta xây dựng một ứng dụng Web API cung cấp cho ứng dụng di động, và chia làm 3 môi trường như sau:

  • Develoment: Môi trường phát triển, là phiên bản API đang phát triển.
  • Staging: Môi trường xem trước, là phiên bản API trong giai đoạn kiểm thử nội bộ, a-b test.
  • Production: Môi trường vận hành cho người dùng cuối (sản phẩm), là phiên bản API cho ứng dụng hiện đang chạy trên thị trường.

figure-1-agile-software-requirements-modelVới Azure App ServiceASP.NET Core, chúng ta sẽ tìm hiểu cách thức hoạt động khi cấu hình và triển khai một hệ thống với nhiều môi trường khác nhau (Multiple Environments)

Bước 1: Khởi tạo Project

Để có thể tiến hành phát triển một Project ASP.NET Core bạn cần phải có đầy đủ các công cụ cũng như SDK cần thiết, bạn có thể tham khảo cách cài đặt ở đây. Trong bài này mình sử dụng Visual Studio 2015 đã cài đặt Azure SDK.NET Core 1.0.0 – VS 2015 Tooling Preview 2.

Bắt đầu tạo một project ASP.NET Core Web App với Visual Studio, mình đặt tên là MyWebApp

step-1-create-projectChọn Web API Template và tick chọn Host in the Cloud để tạo một ứng dụng Web Api đơn giản và cấu hình kết nối đến App Service của Azure.

step-2-choose-template-host-in-the-cloudTạo và cấu hình cho Azure App Service, đây sẽ là môi trường Production tương lai cho Web API của bạn.

step-3-config-new-azure-web-appSau khi hoàn tất quá trình khởi tạo, bạn sẽ có được một Project với cấu trúc như sau

step-4-project-createdBước 2: Chạy thử lần đầu tiên

Bạn nhấn Start with IIS Express trên thanh công cụ hoặc nhấn phím F5 để biên dịch và thực thi ứng dụng Web API trên localhost IIS. Bạn sẽ có thể truy cập được các API đã được khai báo trong ValuesController

step-5-run-first-timeBước 3: Tạo các tập tin chứa các tùy chọn (settings) theo từng môi trường

Mục đích của việc tạo ra các tùy chọn riêng cho từng môi trường là để chứa các cấu hình đặc trưng và tách biệt nhau giữa các môi trường khác nhau để đảm bảo khi vận hành không bị gián đoàn hoặc trùng lấp lên nhau. Vd mỗi môi trường sẽ có cấu hình kết nối đến database (ConnectionString) khác nhau.

Ta bắt đầu bằng việc sao chép tập tin appsettings.json trong project sang 2 tập tin appsettings.Staging.json (chứa các tùy chọn trên môi trường Staging) và appsetting.Production.json (chứa các tùy chọn trên môi trường Production)

step-6-copy-appsettings-json-to-production-staging-settings

Sau khi tạo xong các tập tin sẽ tự thêm vào project như sau:

step-7-settings-file-added

Bước 4: Tạo và sử dụng các tùy chọn

Trong tập tin appsettings.json, thêm đoạn json Data:Setting như sau

Tương tự thêm vào tập tin appsettings.Staging.json

Và cuối cùng là tập tin appsettings.Production.json

Mặc định các tập tin appsettings.*.json sẽ được load khi ứng dụng khởi động, và sẽ được lưu trữ vào tầng cấu hình của ứng dụng, trong tập tin Startup.cs ta có thể thấy đoạn code đọc và build config như sau:

Giá trị của env.EnvironmentName sẽ tùy thuộc vào cấu hình của hệ thống hiện tại mà có thể là Development, Staging hoặc Production.

Để có thể đọc được các giá trị trong Configuration, đầu tiên ta thêm vào tầng Services (DI) của ứng dụng, bằng cách thêm vào phương thức ConfigureServices trong Startup.cs như sau

Ở ứng dụng này mình sử dụng các giá trị trong Configuration trong ValuesController để hiện thị tùy chọn đó khi API được gọi.

Bước 5: Kiểm thử trên môi trường Development

Bạn nhấn Start with IIS Express trên thanh công cụ hoặc nhấn phím F5 để biên dịch và thực thi ứng dụng Web API trên localhost IIS. Với API /api/values bạn sẽ có kết quả như sau

step-13-test-devBước 6: Deploy Web App lên Azure App Service (Production)

Từ menu Build -> Publish MyWebApp chọn profile Azure App Service (demo-env) đã tạo ở Bước 1 -> Publish

step-15-publish-to-prodBước 7: Kiểm thử API trên môi trường Production

Sau khi Publish thành công bạn truy cập theo domain đăng ký, và API /api/values sẽ trả về kết quả ứng với Production settings
step-16-test-prod

Bước 8: Tạo môi trường Staging trên Azure App Service

Để tạo nhiều môi trường khác để Deploy Web App lên cùng một App Service, ta cần tạo các Deployment Slots, mỗi slot sẽ ứng với một Web App con và có cùng hostnames với app chính. Deployment Slots chỉ được hỗ trợ trên các gói Standard hoặc Premium, ở đây mình Scale up lên gói S1

step-17-scale-up-to-s1Tiếp theo ta vào phần tùy chọn Deployment Slots của App Service, chọn Add Slot để thêm một Slot mới,

step-18-add-slot

Đặt tên cho nó là Staging như bên dướistep-19-add-staging-slot

Sau khi tạo thành công bạn sẽ có một Slot, ứng với một Web App con như thế này:

step-20-staging-slot

Tiếp theo vào phần tùy chọn của Slot Staging, chọn Application Settings đến phần App Settings, thêm vào một Setting mới có key là ASPNETCORE_ENVIRONMENT và giá trị là Staging, sau đó tick chọn Slot setting, và Save lại.step-20-1-add-staging-settings

Bước 9: Deploy Web App lên Slot Staging

Từ menu Build -> Publish MyWebApp, tạo một profile mới bằng cách chọn Microsoft Azure App Service

step-21-add-staging-publish-profileTrỏ đến Wep App của bạn, vào phầ Deployment Slots, chọn slot Staging, OK  , sau đó chọn Publish để Deploy Web App lên Azurestep-22-choose-staging-slot

Bước 10: Kiểm thử API trên môi trường Staging

Tương tư sau khi Publish thành công bạn truy cập theo domain đăng ký của slot, và API /api/values sẽ trả về kết quả ứng với Staging settings

step-23-staging-testTổng kết

Như vậy ta có 3 môi trường để thực thi ứng dụng Web API, ta có thể đảm bảo các phiên bản khác nhau trên mỗi môi trường không bị gián đoạn hoặc xung đột với nhau.

Tham khảo source code mẫu: https://github.com/KhuongNtrd/demo-env

step-23-staging-teststep-16-test-prod
step-13-test-dev