Bạn đặt chế độ mặc định cho toàn workflow, đổi chế độ cho một job rồi thử một giá trị riêng trong một step. Step kế tiếp lại thấy giá trị của job. Đó là phạm vi bình thường của env; cấu hình ở step không tự sửa bản mặc định của job.
Bài đọc tài liệu GitHub Actions ngày 06/11/2026. YAML được parse và các script Bash được kiểm cú pháp cục bộ. Script báo cáo cũng được chạy với môi trường giả lập được truyền rõ ràng; chưa gửi workflow lên GitHub hoặc chạy hosted runner. Các kết quả cần quan sát trên Actions được nêu như tiêu chí kiểm tra, không phải log của một lần triển khai thật.
Vẽ phạm vi trước khi đọc giá trị
Khi cùng tên được khai báo ở nhiều cấp env, cấp cụ thể hơn được ưu tiên trong phạm vi tương ứng: step ghi đè job và workflow; job ghi đè workflow. Một khai báo ở step chỉ áp dụng trong lúc step ấy chạy.
Điều này hữu ích khi một job kiểm tra nhiều cấu hình nhưng bạn chỉ muốn một bước dùng giá trị thử nghiệm. Đọc file từ ngoài vào trong và đánh dấu từng nơi khai báo cùng tên sẽ dễ hơn việc tìm một dòng env rồi mặc định nó là giá trị duy nhất.
1. Workflow tối thiểu với ba cấp
Lưu mẫu vào .github/workflows/env-scope-demo.yml trong repository thử nghiệm. Workflow chạy thủ công, không checkout code và không deploy:
name: Env scope demo
'on':
workflow_dispatch:
permissions: {}
env:
DEMO_MODE: workflow
jobs:
inspect:
runs-on: ubuntu-latest
env:
DEMO_MODE: job
steps:
- name: Read job value
shell: bash
run: |
printf 'mode=%s\n' "$DEMO_MODE"
- name: Read step override
env:
DEMO_MODE: step
shell: bash
run: |
printf 'mode=%s\n' "$DEMO_MODE"
- name: Read job value again
shell: bash
run: |
printf 'mode=%s\n' "$DEMO_MODE"
inspect_default:
runs-on: ubuntu-latest
steps:
- name: Read workflow value
shell: bash
run: |
printf 'mode=%s\n' "$DEMO_MODE"
File workflow_dispatch cần có trên nhánh mặc định để được nhận diện theo quy trình chạy thủ công của GitHub. ubuntu-latest là nhãn image có thể thay đổi; demo chỉ dùng printf của shell, không yêu cầu phiên bản package riêng trên image.
Trong job inspect, ba step phải lần lượt báo job, step, job. Job inspect_default không khai báo env cùng tên nên phải thấy workflow. Hai job không có quan hệ needs, vì vậy đừng dùng thứ tự xuất hiện trong log giữa hai job làm bằng chứng về phạm vi biến.
2. Tách giá trị shell khỏi cấu hình workflow
$DEMO_MODE trong mẫu được shell Bash đọc khi script chạy. Context env dùng trong biểu thức workflow là một cơ chế truy cập ở nơi YAML cho phép biểu thức; nó không phải phép đọc mọi biến mà tiến trình runner tình cờ có.
Nếu đổi shell sang PowerShell, cách đọc biến môi trường trong script cũng phải đổi. Không sửa mỗi thuộc tính shell rồi giữ nguyên cú pháp Bash. Giữ ví dụ ở một shell rõ ràng sẽ giúp bạn tách lỗi phạm vi env khỏi lỗi cú pháp của lệnh.
Nếu một script tự gán biến, điều đó lại thuộc phạm vi tiến trình script. Bài này chỉ kiểm tra khai báo env ở workflow, job và step. Truyền giá trị được tạo động sang step khác hoặc sang job khác cần cơ chế tương ứng; không suy ra từ việc override ở step mà các bước sau sẽ tự nhận giá trị mới.
Kiểm tra bằng biến có tên riêng
Dùng tên DEMO_MODE để thử, không thử bằng một biến hệ thống như PATH. Thêm một step không có override ngay sau step có override; đây là ca giúp phân biệt cấu hình tạm thời với thay đổi lan sang phần còn lại.
Khi đưa về project thật, tìm tất cả khai báo cùng tên trong workflow trước khi sửa. Nếu job build và job test dùng giá trị khác nhau có chủ đích, ghi rõ lý do gần khai báo. Nếu muốn một giá trị chung cho mọi job, tránh override cùng tên rải rác mà không có nhu cầu cụ thể.
Lỗi thường gặp và giới hạn
Một lần chạy Bash cục bộ với DEMO_MODE bằng job chỉ chứng minh script in đúng biến được truyền. Nó không chứng minh GitHub đã áp dụng thứ tự ưu tiên env. Muốn xác nhận tích hợp, chạy workflow thử rồi đối chiếu đủ bốn step với bảng kỳ vọng ở trên.
Không nhầm env của workflow với GitHub Environment phục vụ deployment, hay vars và secrets trong các context khác. Chúng có tên gần nhau nhưng giải quyết những việc khác nhau. Với vấn đề đang xét, giữ đúng ba cấp khai báo cùng tên và đọc lại step kế tiếp là cách kiểm tra rõ nhất.

