Yaml cho web developer

File này được dùng khá nhiều cho việc thiết đặt và cấu hình. Mà nhiều nhất là dùng cho các thiết đặt CI/CD. Ngày xưa, khi chưa có Yaml, sau khi quá mệt mỏi với việc mỗi người mỗi ý trong việc viết file cấu hình, nổ ra cái ý tưởng hồi năm 2001

Giờ sao chúng ta không tạo ra một file cấu hình giống như chỉ dẫn nấu ăn, chữ thôi, cực kỳ dễ hiểu

Yaml cũng là một dạng superset của người anh em JSON.

Superset là một ngôn ngữ chứa tất cả feature của một ngôn ngữ, rồi mở rộng thêm một số thứ nữa

Ví dụ như TypeScript là superset của Javascript

{
  "compilerOptions": {
    "module": "system",
    "noImplicitAny": true,
    "removeComments": true,
    "preserveConstEnums": true,
    "outFile": "../../built/local/tsc.js",
    "sourceMap": false,
    "types": ["node", "lodash", "express"]
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules", "**/*.spec.ts"]
}

File JSON không quá khó đọc, tuy nhiên lại vướng một vài hạn chế:

  1. Không dùng biến được
  2. Không dùng biến môi trường được
  3. Không thể override value

YAML sẽ giúp ta làm được những điều chưa làm được ở json

compilerOptions:
  module: system
  noImplicitAny: true
  removeComments: true
  preserveConstEnums: true
  outFile: "../../built/local/tsc.js"
  sourceMap: false
  types:
    - node
    - lodash
    - express
include:
  - src/**/*
exclude:
  - node_modules
  - "**/*.spec.ts"

lưu ý đây chỉ là ví dụ, bạn không thể viết tsconfig bằng YAML, buồn thay

Một số nguyên tắc-cú pháp cần nắm

Thục đầu dòng

Thục đầu dòng rất quan trọng, bạn chỉ được dùng dấu khoảng trắng, không cho phép dùng tab

Viết comment

# I'm a comment
person: # I'm also a comment
  age: 20

Dạng danh sách

Có 2 cách biết, như đã nói là superset của json, nên chúng ta có cách thứ nhất i như json

people: ["Anne", "John", "Max"]

Khuyến khích cách này hơn

people:
  - Anne
  - John
  - Max

Khai báo giá trị string

Trong JSON bạn chỉ một cách viết giá trị dạng String là đưa nó vào dấu ngoặc kép "", Yaml thì linh động hơn

company: Google # Single words, no quotes
full_name: John Foo Bar Doe # Full sentence, no quotes
name: "John" # Using single quotes
surname: "Christian Meyer" # Using double quotes

Trong trường hợp bạn có chưa các ký tự đặc biệt, thì nên đưa vào dấu nháy kép.

Số

year: 2019 # Integer
nodeVersion: 10.8 # Float

Con trỏ

Khái niệm con trỏ xem như bạn đã biết nhé, mình không giải thích, cái này các bạn đi học chắc các thầy dạy kỹ lắm rồi.

Ví dụ như bạn đang viết một số config cho môi trường productionstaging, tức nhiên là một config là giống nhau thôi, nên chúng ta chỉ cần trỏ nó qua một chỗ

Đây là không trỏ qua mà copy/paste huyền thoại

{
  "production": {
    "node_version": "13.0.0",
    "os": "ubuntu",
    "package_manager": "yarn",
    "run": ["yarn install", "NODE_ENV=${ENVIRONMENT} yarn build"],
    "env": {
      "ENVIRONMENT": "production"
    }
  },
  "staging": {
    "node_version": "13.0.0",
    "os": "ubuntu",
    "package_manager": "yarn",
    "run": ["yarn install", "NODE_ENV=${ENVIRONMENT} yarn build"],
    "env": {
      "ENVIRONMENT": "staging"
    }
  }
}

Để dùng con trỏ, chúng ta tạo trước một cái neo để sau này trỏ vào cái neo này

base-config: &base # tên cái neo
  node_version: 13.0.0
  os: ubuntu
  package_manager: yarn
  run:
    - yarn install
    - NODE_ENV=${ENVIRONMENT} yarn build

Sau đó thực hiện việc trỏ

base-config: &base
  node_version: 13.0.0
  os: ubuntu
  package_manager: yarn
  run:
    - yarn install
    - NODE_ENV=${ENVIRONMENT} yarn build

production:
  # dùng các thiết đặt ở neo tên là base
  <<: *base
  env:
    - ENVIRONMENT: production

staging:
  # dùng các thiết đặt ở neo tên là base
  <<: *base
  env:
    - ENVIRONMENT: staging

Môi trường Shell/Bash

Như đã nói lúc đầu, file .yml rất được ưu dùng đề làm config, đặc biệt là config môi trường CI/CD.

Môi trường CI/CD thường là Linux, và chúng ta cũng có thể truy cập đến các biến môi trường của Linux.

Ví dụ như Github CI, chúng ta có thể chỉ định biến môi trường global nào chúng ta muốn truy cập

variables:
  NODE_IMAGE: node:10

stages:
  - build

test:
  image: $NODE_IMAGE
  stage: build

Cú pháp $ không phải của yaml mà là của shell/bash. Những gì Github CI sẽ làm là đưa toàn bộ những biến bạn đặt trong variables và tạo ra biến trong shell

Một vài hệ thống khác cũng inject các giá trị khác như commit ref, branch name, build time, secret key được đặt bên ngoài file config

variables:
  NODE_IMAGE: node:10

stages:
  - build

test:
  image: $NODE_IMAGE
  stage: build
  artifacts:
    name: $CI_COMMIT_REF_NAME

Ví dụ ở trên, chúng ta sử dụng biến môi trường $CI_COMMIT_REF_NAME của GitLab CI.

Hy vọng các bạn đã hiểu chút đỉnh về YAML và cảm thấy đọc file yaml không quá khó chịu nữa.

Tài liệu tham khảo

https://yaml.org/ https://www.json2yaml.com/ https://learnxinyminutes.com/docs/yaml/

Yaml for Web Developers