0
0
Lập trình
Admin Team
Admin Teamtechmely

Hành Trình Tạo CI/CD Pipeline với Tauri và SvelteKit

Đăng vào 3 tuần trước

• 7 phút đọc

Hành Trình Tạo VaultNote: Kinh Nghiệm với Tauri, SvelteKit và CI/CD

Chào các bạn lập trình viên! Tôi là Michael, và tôi rất hào hứng chia sẻ hành trình xây dựng VaultNote, một ứng dụng ghi chú nhỏ mà tôi sử dụng để khám phá phát triển ứng dụng đa nền tảng với Tauri và SvelteKit. Nếu bạn quan tâm đến JavaScript, Svelte, hoặc chỉ đơn giản là tò mò về việc xây dựng ứng dụng cho desktop và mobile, bài viết này sẽ dành cho bạn. Ứng dụng hiện tại chỉ thực hiện các chức năng ghi chú cơ bản với khả năng hiển thị markdown, nhưng mục tiêu thực sự của tôi là tìm hiểu cách đưa nó lên Windows, macOS (Intel/ARM), Linux và Android (APK/AAB) chỉ với một mã nguồn duy nhất. Kết quả là một prototype hoạt động được!

Bài viết này không phải là hướng dẫn "cách xây dựng ứng dụng Tauri của riêng bạn" (có thể tôi sẽ viết một cái sau). Nó nhiều hơn về trải nghiệm của tôi: những thành công, những đau đầu (ôi, những cơn đau đầu), và những gì cần thiết để thiết lập một CI/CD pipeline hoạt động trên GitHub Actions. Đây là lần đầu tiên tôi thực hiện một CI pipeline đúng nghĩa, trải qua rất nhiều nghiên cứu, một chút trợ giúp từ AI (cảnh báo: phần lớn không hữu ích), và hơn 60 lần chạy thất bại. Nếu bạn là một lập trình viên JavaScript, một fan của Svelte, hoặc chỉ là một coder từ bất kỳ lĩnh vực nào, tôi hy vọng bài viết này sẽ giúp bạn tiết kiệm được một chút đau khổ. Vì tôi mới mẻ trong lĩnh vực này, tôi rất mong nhận được phản hồi từ bạn—hãy fork repo, mở vấn đề, hoặc gửi PR. Hãy cùng nhau cải thiện nó!

Tại Sao Chọn Tauri + SvelteKit?

Tôi chọn Tauri vì nó nhẹ và bảo mật, biến các ứng dụng web thành các tệp nhị phân native cho desktop/mobile mà không gặp phải sự nặng nề của Electron. Cấu hình xây dựng rất nhỏ: ~5MB cho Windows/macOS, ~80MB cho Linux AppImage, ~43MB cho Android APK. SvelteKit là lựa chọn không cần phải bàn cho frontend—phản ứng nhanh, mượt mà, và kết hợp với Vite và Bun để có trải nghiệm phát triển tuyệt vời. Về lưu trữ dữ liệu, tôi đã thử Prisma nhưng cuối cùng chọn Dexie.js cho IndexedDB. Không có tùy chọn cơ sở dữ liệu đa nền tảng nào phù hợp với tôi trong JavaScript, và các crate DB của Rust có vẻ quá cơ bản cho thời điểm này, vì vậy Dexie là lựa chọn hoàn hảo.

Bắt đầu rất dễ dàng: chỉ cần lấy một cấu hình Tauri + SvelteKit (không phải là một mẫu, nhưng có thể tôi sẽ làm một cái sau), điều chỉnh src-tauri/tauri.conf.json, và chạy bun dev cho web hoặc bun tauri dev cho desktop. Android? cargo tauri android dev sau khi vật lộn với Android Studio. Nhưng tự động hóa tất cả điều này trong CI? Đó là nơi cuộc chiến thực sự bắt đầu.

Hành Trình CI/CD: Từ Lộn Xộn Đến Thành Công

Mục tiêu của tôi rất đơn giản (hoặc tôi đã nghĩ vậy): đẩy lên main, tự động tăng phiên bản, xây dựng cho 6 nền tảng (4 desktop + Android APK/AAB), ký các bản dựng Android, và thả các artifacts sạch vào GitHub Releases. Nó đã mất hàng tháng, hơn 60 lần chạy thất bại và giải quyết 6 vấn đề lớn trên Android. Tôi đã sử dụng GitHub Actions với release-please cho việc tăng phiên bản, tauri-action cho việc xây dựng, và một tập lệnh tùy chỉnh để giữ cho các phiên bản đồng bộ. Dưới đây là tóm tắt.

Bước 1: Đồng Bộ Phiên Bản

Sự không đồng nhất về phiên bản là một kẻ giết người thầm lặng. package.json (JavaScript) phải đồng bộ với Cargo.toml (Rust) và tauri.conf.json. Ngay từ đầu, tôi đã gặp lỗi như "Không thể phân tích phiên bản '2'". Giải pháp của tôi: một tập lệnh Node (scripts/sync-versions.js) thiết lập package.json như là nguồn thông tin duy nhất, cập nhật Cargo.toml, và kiểm tra tauri.conf.json trỏ đến nó. Tôi chạy nó trước khi commit và trong CI.

Quy trình làm việc (.github/workflows/release.yml) bắt đầu với release-please, tự động tăng phiên bản dựa trên các commit và tạo các tag/PR. Mỗi công việc kiểm tra tag và đồng bộ lại các phiên bản. Mẹo: Xác thực phiên bản sớm—điều này đã cứu tôi khỏi những bản phát hành bị hỏng.

Bước 2: Xây Dựng Desktop – Chiến Thắng Dễ Dàng

Việc xây dựng desktop là thời gian yên bình trước cơn bão. Công việc publish-tauri sử dụng chiến lược ma trận: xây dựng song song trên windows-latest, macos-latest (các mục tiêu Intel + ARM) và ubuntu-22.04. Các bước: cài đặt các phụ thuộc (như WebKit cho Linux), thiết lập Bun/Rust, lưu cache với swatinem/rust-cache, xây dựng tài sản web (bun vite build), và để tauri-action đóng gói/tải lên.

Các vấn đề nhỏ: macOS cần --target aarch64-apple-darwin rõ ràng. Linux yêu cầu libwebkit2gtk-4.1-dev. Thời gian xây dựng mất 4-8 phút với tỷ lệ thành công >95%. Các artifacts: .msi/.exe (~5MB) cho Windows, .dmg (~5.5MB) cho macOS, AppImage/deb/rpm (~79MB) cho Linux. Thiết lập fail-fast: false là một cứu cánh—nếu một nền tảng thất bại, các nền tảng khác vẫn có thể phát hành.

Bước 3: Xây Dựng Android – Cuộc Chiến Thực Sự

Android là một thử thách thực sự. Tôi nghĩ rằng "thêm một công việc" sẽ nhanh chóng. Không phải vậy. Công việc publish-android trên Ubuntu thiết lập Java 17, Android SDK/NDK, các mục tiêu Android của Rust (aarch64-linux-android, v.v.), và chạy cargo tauri android build. Nghe có vẻ đơn giản? Nó không phải vậy. Đây là những gì tôi đã vật lộn:

  • Sự hỗn độn của SDK PATH: apksigner cứ biến mất. Giải pháp: Cài đặt build-tools 34.0.0 qua sdkmanager, thêm vào $GITHUB_PATH, xác minh với which apksigner.
  • Lỗi phân tích phiên bản: Rust không thích tauri = "2". Nghiên cứu (tài liệu Tauri + một số trợ giúp từ Grok/Exa) cho thấy tôi cần các điểm gắn như tauri = "2.8.5".
  • Khó khăn trong ký keystore: Giải mã base64 bí mật, tạo keystore.properties, xác thực kích thước tệp. Tauri tự động ký APK—không cần apksigner thủ công (cái đó làm hỏng mọi thứ).
  • Nhầm lẫn về đường dẫn/đầu ra: Tôi mong đợi các APK chưa ký, nhưng Tauri cung cấp các bản đã ký. Đã sửa đường dẫn đến app-universal-release.apk.
  • Sửa đổi nhãn hiệu: Đổi tên app-universal-release.* thành vaultnote-v0.21.5-universal.* sau khi xây dựng.

Các bí mật: ANDROID_KEYSTORE* cho việc ký, VITE_LOGIN_URL cho cấu hình. Đầu ra: 43MB APK, 20MB AAB trong 10-15 phút. AI không hữu ích lắm lúc đầu—các câu trả lời chung chung cho đến khi tôi đào sâu vào các diễn đàn Tauri. Thử và sai? Hơn 60 lần chạy thất bại.

Những Gì Đang Hoạt Động Hiện Nay

Tính đến phiên bản v0.21.5 (23 tháng 9, 2025), khi đẩy lên main:

  • Kích hoạt release-please: Đồng bộ phiên bản, tạo tag/PR.
  • Nếu một bản phát hành được tạo: Chạy publish-tauri (ma trận) + publish-android.
  • Tải lên các artifacts đã ký, có nhãn hiệu đến GitHub Releases với "Xem tài sản dưới đây."

Tỷ lệ thành công: >95%. Tổng thời gian: 15-25 phút. Ứng dụng hoạt động trên tất cả các nền tảng, lưu trữ ghi chú cục bộ với Dexie.js và hiển thị markdown qua Carta-MD. Mã của toàn bộ pipeline, hướng dẫn desktop/Android và báo cáo đã hợp nhất có sẵn trong progress/ci-cd-documentation trong repo.

Bài Học Tôi Rút Ra

  • Bắt đầu nhỏ: Desktop trước, mobile sau. Công cụ Android là một cơn ác mộng—hãy lập kế hoạch cho nó.
  • Một nguồn phiên bản: package.json là vua. Các tập lệnh tốt hơn việc chỉnh sửa thủ công.
  • Đào sâu: Tài liệu và Discord của Tauri > AI chung chung. Grok/Exa đã giúp tôi với các điểm gắn Rust cụ thể.
  • Ghi lại mọi thứ: cat cấu hình, ls -la đầu ra, set -euo pipefail trong bash—đã cứu tôi trong việc gỡ lỗi.
  • Phân tách nó ra: Giải quyết 6 vấn đề của Android từng chút một, tuần này qua tuần khác.
  • Dựa vào cộng đồng: Các mẫu Tauri và cộng đồng Actions đã hỗ trợ tôi rất nhiều.

Còn thiếu gì? Chưa có iOS—tôi không có Mac hoặc tài khoản phát triển Apple. Ký desktop vẫn chưa rõ ràng. Thời gian xây dựng có thể giảm với cache tốt hơn.

Đến Lượt Bạn: Cải Thiện Nó!

VaultNote là một dự án học hỏi để thử thách Tauri và SvelteKit đến giới hạn của chúng. Ứng dụng này còn khá cơ bản, nhưng pipeline thì là một thành tựu mà tôi tự hào. Muốn khám phá không? Hãy đến github.com/Michael-Obele/VaultNote, đặc biệt là progress/ci-cd-documentation để xem mã nguồn và hướng dẫn đầy đủ. Fork, thử nghiệm, và phá hủy nó. Có ý tưởng cho iOS, xây dựng nhanh hơn, hoặc ký tốt hơn? Mở các vấn đề hoặc PR—tôi rất muốn học hỏi từ bạn. Các lập trình viên ở mọi lĩnh vực, hãy kết nối và tiếp tục xây dựng! 🚀

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào