aedev.net
  • Trang chủ
  • AI
  • Mobile
  • Flutter
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
No Result
View All Result
SAVED POSTS
aedev.net
  • Trang chủ
  • AI
  • Mobile
  • Flutter
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
No Result
View All Result
aedev.net
No Result
View All Result
Minh họa pipeline CI/CD từ commit đến deploy cho team nhỏ

GitHub Actions: working-directory cho từng step và vì sao cd không được giữ

Suong Nguyen by Suong Nguyen
11/11/2026
in DevOps
0
585
SHARES
3.2k
VIEWS
Summarize with ChatGPTShare to Facebook

Trong monorepo, một step chạy được sau cd packages/api, nhưng step tiếp theo báo không tìm thấy file. Hai step nhìn thấy cùng filesystem của job, song không dùng chung một shell đang đứng ở thư mục đó. Cần khai báo nơi chạy lệnh cho từng step hoặc đặt mặc định.

Bài này xây một workflow nhỏ không tải repository, không cài package và không gọi dịch vụ ngoài. Các thư mục được tạo ngay trong job để bạn quan sát đường dẫn. Khi áp dụng cho repository thật, cần bổ sung bước checkout phù hợp trước các lệnh đọc source.

Phạm vi kiểm tra

Đối chiếu tài liệu GitHub Actions ngày 11/11/2026. YAML được phân tích cú pháp bằng Ruby; các đoạn Bash được kiểm tra cú pháp và chạy cục bộ trong thư mục tạm. Chưa chạy trên GitHub-hosted runner, chưa đo thời gian, chi phí hay hành vi một action bên thứ ba.

Tài liệu cho phép đặt defaults.run.working-directory ở cấp workflow hoặc job; cấu hình cụ thể hơn được ưu tiên. Thiết lập này dành cho step run. Nó không tự biến đường dẫn của mọi uses action thành đường dẫn tương đối với thư mục ấy.

1. Workflow tự tạo dữ liệu thử

Lưu ví dụ sau thành .github/workflows/directory-demo.yml trong một repository thử nghiệm. Workflow chỉ chạy thủ công và không cần quyền đọc nội dung repository vì không checkout.

name: Directory demo
on:
  workflow_dispatch:
permissions: {}
jobs:
  inspect:
    runs-on: ubuntu-latest
    defaults:
      run:
        shell: bash
        working-directory: packages/api
    steps:
      - name: Create fixture from workspace root
        working-directory: ${{ github.workspace }}
        run: |
          set -euo pipefail
          mkdir -p packages/api
          printf '%s\n' 'api-demo' > packages/api/name.txt
      - name: Read from the job default directory
        run: |
          set -euo pipefail
          test "$(cat name.txt)" = 'api-demo'
          cd ..
          test -d api
      - name: Start in the default directory again
        run: |
          set -euo pipefail
          test -f name.txt
          pwd
      - name: Override for one step
        working-directory: ${{ github.workspace }}
        run: |
          set -euo pipefail
          test -f packages/api/name.txt
          pwd

Step đầu phải chạy ở workspace root vì thư mục mặc định chưa tồn tại. Nếu bỏ override này, runner không thể vào thư mục cần tạo trước khi thực thi script tạo nó. Đây là ví dụ về thứ tự chuẩn bị filesystem, không phải lỗi quyền đọc file.

Step thứ hai đọc name.txt, sau đó đi lên packages. Step thứ ba vẫn bắt đầu tại packages/api, nên tiếp tục thấy name.txt. Step cuối chỉ đổi nơi chạy của chính nó về root.

2. Tách filesystem và trạng thái shell

File do step đầu ghi có thể được step khác trong cùng job đọc lại. Ngược lại, cd chỉ thay đổi thư mục làm việc của process hiện tại. Khi process kết thúc, không có một “con trỏ thư mục” chung được chuyển sang step kế tiếp.

Trong fixture local, các script được chạy bằng những process Bash riêng với cwd chỉ định rõ. Điều đó kiểm tra được đường dẫn và điều kiện test, nhưng không mô phỏng toàn bộ runner. Kết quả chạy local không nên được ghi thành một lần workflow đã thành công trên GitHub.

3. Áp dụng cho monorepo thật

Nếu hầu hết lệnh thuộc một package, đặt mặc định cấp job để giảm lặp. Với một lệnh ở root, override ngay tại step và giữ lệnh tương đối ngắn. Tránh vừa thêm packages/api/ vào mọi đường dẫn vừa chạy trong chính packages/api; kết quả dễ thành một đường dẫn lồng sai.

Sau checkout, thêm kiểm tra file quan trọng trước lệnh build: package manifest, script kiểm thử hoặc lockfile mong đợi. Một thông báo lỗi sớm về file thiếu dễ xử lý hơn log dài của package manager đang chạy nhầm package.

Với step uses, đọc input đường dẫn của action đó. Tên input có thể là path, working-directory hoặc một lựa chọn khác; không suy ra từ thiết lập của step run. Ví dụ bài này không dùng action ngoài nên không kiểm chứng hợp đồng của bất kỳ action cụ thể nào.

Kiểm tra và lỗi thường gặp

Chạy workflow thủ công trong repository thử rồi xem hai dòng pwd: một dòng nằm ở package, dòng kia ở root. Những assertion là điều kiện mong đợi để bạn xác minh; chưa có log hosted runner trong bài.

Nếu thất bại trước khi script in gì, kiểm tra thư mục làm việc đã tồn tại chưa. Nếu lệnh đọc file sai, kiểm tra bạn đang dùng đường dẫn tính từ root hay từ package. Nếu chỉ step sau bị sai, tìm giả định rằng cd được giữ lại.

Kết luận

Khai báo nơi chạy lệnh giúp workflow monorepo dễ đọc và kiểm tra. File có thể tồn tại giữa các step trong cùng job; thư mục hiện tại của một shell cần được thiết lập lại theo cấu hình step mới.

Nguồn tham khảo

  • GitHub: Workflow syntax và defaults.run

Tags: CI/CDGitHub ActionsMonorepo
SummarizeShare234
Suong Nguyen

Suong Nguyen

Related Stories

Minh họa pipeline CI/CD từ commit đến deploy cho team nhỏ

GitHub Actions matrix: fail-fast false giữ các lượt kiểm tra, không bỏ qua lỗi

by Suong Nguyen
10/11/2026
0

Tách việc hủy các job còn lại trong matrix khỏi việc cho phép một job lỗi, với workflow ba shard và script có kết quả kiểm tra rõ...

Minh họa pipeline CI/CD từ commit đến deploy cho team nhỏ

Bash wrapper: dùng “$@” để giữ nguyên từng đối số khi gọi lệnh

by Suong Nguyen
09/11/2026
0

Kiểm tra wrapper Bash với đường dẫn có khoảng trắng, chuỗi rỗng và ký tự sao để thấy khác biệt giữa "$@", "$*" và $@ không quote.

Minh họa pipeline CI/CD từ commit đến deploy cho team nhỏ

GitHub Actions: truyền giá trị từ step sang job bằng GITHUB_OUTPUT

by Suong Nguyen
08/11/2026
0

Nối đúng ba tầng step output, job output và needs để job sau đọc được giá trị do một bước trước tạo ra.

Minh họa pipeline CI/CD từ commit đến deploy cho team nhỏ

GitHub Actions needs: cho job báo cáo chạy khi job kiểm tra thất bại

by Suong Nguyen
07/11/2026
0

Dùng needs cùng điều kiện trạng thái để đọc kết quả job trước mà vẫn giữ lỗi của workflow, thay vì vô tình bỏ qua bước báo cáo.

0 0 votes
Article Rating
Subscribe
Login
Notify of
guest
guest
0 Comments
Oldest
Newest Most Voted
AE Dev

AE Dev mang đến các bài viết về lập trình, mobile app, backend, frontend, WordPress và công nghệ, phù hợp cho developer muốn học hỏi và cập nhật kiến thức thực tế.

Recent Posts

  • React Native: thông báo nội dung đổi cho TalkBack bằng accessibilityLiveRegion
  • Promise.finally: return giá trị mới có thay kết quả của chuỗi không?
  • Android TextUtils.isEmpty không loại chuỗi toàn khoảng trắng

Categories

  • AI
  • Backend
  • Đánh giá
  • DevOps
  • Flutter
  • Hướng dẫn
  • Lập trình Mobile
  • Phỏng vấn
  • React Native
  • Uncategorized

Weekly Newsletter

  • Buy JNews
  • Support Forum
  • Pre-sale Question
  • Contact Us

© 2026 AE Dev - Blog công nghệ, lập trình và chia sẻ kiến thức IT.

Welcome Back!

Login to your account below

Forgotten Password?

Retrieve your password

Please enter your username or email address to reset your password.

Log In
No Result
View All Result
  • Trang chủ
  • AI
  • Mobile
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
  • Flutter

© 2026 AE Dev - Blog công nghệ, lập trình và chia sẻ kiến thức IT.

wpDiscuz
0
0
Would love your thoughts, please comment.x
()
x
| Reply