Lane — คือสคริปต์อัตโนมัติที่มีชื่อใน Fastlane ซึ่งรวมลำดับของการดำเนินการ (actions) สำหรับการสร้าง การทดสอบ หรือการจัดส่งแอปพลิเคชันมือถือ แต่ละ lane ถูกกำหนดใน Fastfile ด้วยภาษา Ruby และสามารถรันได้ด้วยคำสั่งเดียวจากเทอร์มินัลหรือระบบ CI/CD ตามข้อมูลจาก Fastlane Docs, 2025 85% ของ Fastfile มีมากกว่าสาม lane สำหรับขั้นตอน CI/CD ที่แตกต่างกัน Lane สามารถรับพารามิเตอร์ เรียกใช้ lanes อื่น ๆ และจัดการข้อผิดพลาดในการทำงาน
ประเด็นสำคัญ
Lane — คือบล็อกพื้นฐานของ Fastlane ที่กำหนดสคริปต์อัตโนมัติที่มีชื่อ แต่ละ lane อธิบายลำดับของการดำเนินการ (actions) ที่ดำเนินการเพื่อบรรลุเป้าหมายเฉพาะ: สร้างแอปพลิเคชัน รันทดสอบ อัปโหลดบิลด์ไปยังสโตร์ หรือกำหนดค่าสภาพแวดล้อม Lane ถูกประกาศใน Fastfile และรันด้วยคำสั่ง fastlane [ชื่อ_lane] จากรากของโปรเจกต์
แนวคิดของ lane นำมาจาก Ruby DSL และรับประกัน ความสามารถในการอ่านสคริปต์ นักพัฒนามองเห็นกระบวนการ CI/CD ทั้งหมดเป็นลำดับของการเรียก actions พร้อมชื่อและพารามิเตอร์ที่เข้าใจได้ Lane สามารถเป็นแบบง่าย (คำสั่งเดียว) หรือซับซ้อน (การแยกสาขา ลูป การเรียก lanes อื่น)
แต่ละ lane หลังจากดำเนินการจะส่งคืน ผลลัพธ์ — ออบเจกต์ที่มีสถานะการดำเนินการและข้อมูลจาก actions ผลลัพธ์สามารถใช้ใน lanes อื่นหรือส่งต่อไปยังระบบ CI/CD เพื่อการตัดสินใจ หาก action ใด ๆ ใน lane สิ้นสุดด้วยข้อผิดพลาด การดำเนินการของ lane จะหยุดและเรียกบล็อก error
ไวยากรณ์การประกาศ lane เป็นไปตามรูปแบบ Ruby DSL ง่าย ๆ: คีย์เวิร์ด lane, ชื่อสคริปต์เป็นสัญลักษณ์ Ruby (symbol), บล็อก do ... end พร้อมเนื้อหาสคริปต์ ชื่อ lane ต้องไม่ซ้ำกันภายในแพลตฟอร์มและประกอบด้วยตัวอักษร ตัวเลข และขีดล่าง
การรัน lane ดำเนินการผ่านบรรทัดคำสั่ง: fastlane build (สำหรับ lane ที่ชื่อ :build) หรือ bundle exec fastlane build (หาก Fastlane ติดตั้งผ่าน Bundler) สำหรับ lanes เฉพาะแพลตฟอร์ม ให้ใช้ fastlane ios build หรือ fastlane android build
# การประกาศ lane อย่างง่าย
lane :test do
scan(scheme: 'App', devices: ['iPhone 15'])
end
lane :build_and_deploy do
cocoapods
test
gym(scheme: 'App', export_method: 'app-store')
pilot(skip_waiting_for_build_processing: true)
end
# รัน: fastlane build_and_deploy
Lane สามารถมี ตรรกะแบบมีเงื่อนไข ตามพารามิเตอร์หรือตัวแปรสภาพแวดล้อม ใช้ if/unless เพื่อข้ามขั้นตอนในเงื่อนไขที่กำหนด นอกจากนี้ยังมีลูป each สำหรับการประมวลผลอาเรย์ ซึ่งสะดวกสำหรับการสร้างหลายเป้าหมายหรือสคีมาแอปพลิเคชันใน lane เดียว
Lane สามารถคืนค่าที่โค้ดผู้เรียกสามารถเข้าถึงได้ สำหรับการคืนค่า ให้ใช้ return ปกติของ Ruby หรือนิพจน์สุดท้ายในบล็อก lane ค่าที่คืนสามารถเป็นสตริง ตัวเลข hash หรือผลลัพธ์ของ action ซึ่งช่วยให้ใช้ผลลัพธ์ของ lane หนึ่งในอีก lane หนึ่งเพื่อการตัดสินใจ
ตัวอย่างเช่น lane :get_version สามารถคืนเวอร์ชันปัจจุบันของแอปพลิเคชันจาก Info.plist และ lane :deploy ใช้มันเพื่อจัดรูปแบบข้อความใน Slack ค่าที่คืนมีประโยชน์โดยเฉพาะใน private lanes ซึ่งผลลัพธ์จำเป็นสำหรับการประมวลผลต่อใน lane ที่เรียก
พารามิเตอร์ของ lane ทำให้สคริปต์มีความยืดหยุ่นและนำกลับมาใช้ใหม่ได้ Lane รับพารามิเตอร์ผ่าน options hash ซึ่งส่งผ่านเมื่อรันจากบรรทัดคำสั่ง: fastlane deploy scheme:AppStore version:2.1.0 ภายใน lane พารามิเตอร์สามารถเข้าถึงได้เป็น options[:scheme] และ options[:version]
สำหรับ พารามิเตอร์ที่จำเป็น ให้ตรวจสอบการมีอยู่ของค่าที่จุดเริ่มต้นของ lane และเรียก UI.user_error! พร้อมข้อความที่ชัดเจน สำหรับพารามิเตอร์ที่ไม่บังคับ ให้กำหนดค่าเริ่มต้นผ่านตัวดำเนินการ || Fastlane ยังรองรับพารามิเตอร์แบบระบุชนิดผ่านเมธอด options พร้อมระบุชนิด ค่าเริ่มต้น และคำอธิบาย
# Lane พร้อมการจัดการพารามิเตอร์
lane :deploy do |options|
scheme = options[:scheme]
version = options[:version] || '1.0.0'
beta = options[:beta] || false
UI.user_error!("ไม่ได้ระบุ scheme") unless scheme
match(type: beta ? 'adhoc' : 'appstore')
gym(scheme: scheme, export_method: beta ? 'ad-hoc' : 'app-store')
if beta
pilot(distribute_external: true)
else
deliver(submit_for_review: true)
end
end
# รัน: fastlane deploy scheme:MyApp beta:true version:2.1.0
สำหรับการทำงานกับ ตัวแปรสภาพแวดล้อม ภายใน lane ให้ใช้ ENV['VARIABLE_NAME'] Fastlane โหลดไฟล์ .env จากไดเรกทอรี fastlane โดยอัตโนมัติ นี่เป็นวิธีมาตรฐานในการส่งข้อมูลที่ละเอียดอ่อน — คีย์ API รหัสผ่าน และโทเคน — ในสภาพแวดล้อม CI/CD โดยไม่ต้องเก็บไว้ใน Fastfile
สำหรับการทำงานที่เชื่อถือได้ของ lane จำเป็นต้องตรวจสอบพารามิเตอร์ขาเข้า ใช้ UI.user_error! พร้อมคำอธิบายปัญหาหากพารามิเตอร์ที่จำเป็นหายไปหรือมีชนิดไม่ถูกต้อง Fastlane มีเมธอด options ที่ให้กำหนดชนิด (String, Boolean, Integer, Array) ค่าเริ่มต้น และคำอธิบายสำหรับแต่ละพารามิเตอร์ — การตรวจสอบจะดำเนินการโดยอัตโนมัติเมื่อเริ่ม lane
นอกจากนี้ยังสามารถใช้การตรวจสอบผ่านบล็อก verify: verify do |value| value.length > 0 end สำหรับพารามิเตอร์สตริง ในกรณีรูปแบบไม่ถูกต้อง Fastlane จะแสดงข้อความที่ชัดเจนพร้อมระบุรูปแบบที่คาดหวังและค่าที่ส่ง ซึ่งช่วยอำนวยความสะดวกในการดีบักในสภาพแวดล้อม CI/CD
Fastlane มี ฮุควงจรชีวิต สำหรับรันโค้ดก่อนและหลังแต่ละ lane บล็อก before_all จะรันก่อนแต่ละ lane บนแพลตฟอร์มที่กำหนดหรือทั่วโลก บล็อก after_all จะรันหลังจาก lane เสร็จสมบูรณ์ บล็อก error จะรันเมื่อเกิดข้อผิดพลาดภายใน lane
ฮุคช่วยให้ รวมศูนย์ตรรกะที่ซ้ำกัน: การติดตั้ง dependencies ใน before_all การส่งการแจ้งเตือนใน after_all การล้างไฟล์ชั่วคราวและการแจ้งข้อผิดพลาดในบล็อก error ซึ่งช่วยลดการซ้ำซ้อนของโค้ดและทำให้ lanes สะอาดขึ้น
# ฮุควงจรชีวิตของ lanes
default_platform(:ios)
before_all do
cocoapods(try_repo_update_on_error: true)
ensure_git_status_clean
end
after_all do |lane|
slack(message: "Lane #{lane} ดำเนินการสำเร็จ")
end
error do |lane, exception|
slack(
message: "Lane #{lane} ล้มเหลวด้วยข้อผิดพลาด: #{exception}",
success: false
)
end
lane :deploy do
match(type: 'appstore')
gym(export_method: 'app-store')
deliver
end
บล็อก error รับอาร์กิวเมนต์สองตัว: ชื่อ lane (symbol) และออบเจกต์ข้อยกเว้น ภายในบล็อก คุณสามารถส่งการแจ้งเตือนใน Slack เขียนล็อกลงไฟล์ หรือเรียกใช้สคริปต์กู้คืนทางเลือก หากบล็อก error เสร็จสมบูรณ์ Fastlane จะไม่ถือว่าบิลด์ล้มเหลวในระดับ CI/CD
Private lane — คือ lane ที่ประกาศผ่าน private_lane แทน lane ซึ่งไม่แสดงในรายการคำสั่งที่พร้อมใช้งานและไม่สามารถรันได้โดยตรงจากเทอร์มินัล Private lanes ออกแบบมาเพื่อห่อหุ้มขั้นตอนที่ซ้ำกันซึ่งถูกเรียกจากหลาย public lanes
Private lanes มีประโยชน์อย่างยิ่งสำหรับ ลำดับที่ซับซ้อน ของการดำเนินการที่ต้องดำเนินการตามลำดับที่กำหนดอย่างเคร่งครัด ตัวอย่างเช่น private lane :setup_signing สามารถเรียกได้จาก lanes :build_dev, :build_staging และ :build_production ด้วยพารามิเตอร์ที่แตกต่างกัน แต่ตัวมันเองไม่มีความหมายเป็นคำสั่งแยก
# Private lanes สำหรับการใช้ซ้ำ
private_lane :setup_environment do |options|
cocoapods(try_repo_update_on_error: true)
match(type: options[:type], readonly: true)
increment_build_number
end
lane :dev_build do
setup_environment(type: 'development')
gym(export_method: 'development')
end
lane :appstore_build do
setup_environment(type: 'appstore')
gym(export_method: 'app-store')
deliver
end
Private lanes สามารถเรียก private lanes อื่น สร้าง ลำดับชั้นของนามธรรม แนะนำให้จำกัดความลึกของการซ้อนกันไว้ที่ 2–3 ระดับเพื่อรักษาความสามารถในการอ่านของ Fastfile จัดทำเอกสารแต่ละ private lane ด้วยคอมเมนต์ที่อธิบายวัตถุประสงค์และพารามิเตอร์ที่คาดหวัง
มาดู ตัวอย่างเชิงปฏิบัติ ของ lanes สำหรับโปรเจกต์ iOS และ Android โดยทั่วไป iOS lanes ใช้ scan สำหรับการทดสอบ match สำหรับใบรับรอง gym สำหรับการสร้าง และ pilot หรือ deliver สำหรับการจัดส่ง Android lanes ใช้ gradle สำหรับการสร้าง supply สำหรับการเผยแพร่ และ firebase_test_lab สำหรับการทดสอบบนคลาวด์
// Lane สำหรับ CI/CD เต็มรูปแบบของแอป iOS
lane :ci_full_ios do
scan(scheme: 'App', code_coverage: true)
gym(scheme: 'App', export_method: 'app-store')
pilot(distribute_external: true)
slack(message: 'CI/CD iOS เสร็จสมบูรณ์')
end
/* Lane สำหรับ CI/CD เต็มรูปแบบของแอป Android */
lane :ci_full_android do
gradle(task: 'testReleaseUnitTest')
gradle(task: 'bundleRelease')
supply(track: 'internal')
end
การรวม lanes สำหรับ iOS และ Android คุณสามารถสร้าง กระบวนการ CI/CD แบบรวม สำหรับแอปพลิเคชันข้ามแพลตฟอร์ม ใช้บล็อกแพลตฟอร์ม platform :ios และ platform :android เพื่อจัดกลุ่ม lanes เฉพาะแพลตฟอร์ม และเรียกใช้จาก lane orchestrator ทั่วไปที่จัดการลำดับการดำเนินการ
เมื่อเขียน lanes แนะนำให้ปฏิบัติตามชุดแนวปฏิบัติที่รับประกันความสามารถในการอ่าน การบำรุงรักษา และความน่าเชื่อถือของสคริปต์ กฎข้อแรก — แต่ละ lane ควรทำภารกิจเดียว หาก lane ทำอะไรหลายอย่างเกินไป ให้แบ่งเป็นหลาย lanes และ private lanes
กฎข้อที่สอง — การตั้งชื่อ lanes ควรเป็นคำกริยาหรือวลีกริยา: build, deploy, test, upload_screenshots หลีกเลี่ยงชื่อนามธรรมเช่น process หรือ do_all ใช้ขีดล่างเพื่อแยกคำในชื่อ lane
กฎข้อที่สาม — จัดการข้อผิดพลาดอย่างชัดเจน ใช้ UI.user_error! สำหรับข้อความที่เข้าใจได้เกี่ยวกับปัญหา อย่าพึ่งพาข้อความข้อผิดพลาดมาตรฐานของ Fastlane — ให้บริบทแก่นักพัฒนา: “ไม่พบไฟล์ GoogleService-Info.plist — เพิ่มไปยังโปรเจกต์” แทนที่ “File not found”
| แนวปฏิบัติ | คำอธิบาย | ตัวอย่าง |
|---|---|---|
| ภารกิจเดียว | Lane ดำเนินการหนึ่งการดำเนินการเชิงตรรกะ | lane :run_tests, lane :build_ipa |
| พารามิเตอร์ | การตั้งค่าทั้งหมดผ่าน options หรือ ENV | options[:scheme] || default |
| ฮุค | before_all/after_all สำหรับโค้ดทั่วไป | cocoapods ใน before_all |
| คอมเมนต์ | จัดทำเอกสารส่วนที่ซับซ้อน | # สร้างด้วย bitcode |
| ข้อผิดพลาด | ข้อความข้อผิดพลาดที่เข้าใจได้ | UI.user_error!(“...”) |
กฎข้อที่สี่ — ทดสอบ lanes ในเครื่องก่อนรันบน CI/CD Fastlane รองรับโหมด dry-run ผ่านแฟล็ก --dry-run ซึ่งแสดงว่า actions ใดจะถูกดำเนินการโดยไม่รันจริง ใช้ fastlane run_test สำหรับทดสอบ lanes แต่ละรายการอย่างแยกก่อนการรวม
การจัดทำเอกสารของแต่ละ lane เป็นแนวปฏิบัติที่สำคัญสำหรับการพัฒนาทีม Fastlane รองรับการสร้างเอกสารอัตโนมัติจากบล็อก desc ที่วางไว้ก่อนการประกาศ lane ข้อความ desc จะแสดงเมื่อรัน fastlane lanes และ fastlane list ช่วยให้นักพัฒนาเข้าใจวัตถุประสงค์ของแต่ละสคริปต์โดยไม่ต้องอ่านซอร์สโค้ดของ Fastfile
สำหรับการจัดทำเอกสารพารามิเตอร์ ให้ใช้คอมเมนต์ Ruby พร้อมคำอธิบายค่าที่คาดหวัง Fastlane สามารถสร้าง README.md พร้อมรายการ lanes ทั้งหมดและคำอธิบายผ่านคำสั่ง fastlane generate_docs ซึ่งสะดวกสำหรับการปรับตัวของสมาชิกทีมใหม่ให้เข้ากับกระบวนการ CI/CD ของโปรเจกต์
คำถามที่พบบ่อย
Lane — คือสคริปต์อัตโนมัติที่มีชื่อใน Fastlane ประกาศใน Fastfile ด้วย Ruby Lane รวมลำดับของ actions เพื่อดำเนินงานเฉพาะ: สร้างแอปพลิเคชัน รันทดสอบ หรือปรับใช้ รันผ่าน fastlane [ชื่อ_lane] จากเทอร์มินัลหรือระบบ CI/CD
ใช้โครงสร้าง lane :ชื่อ do ... end ใน Fastfile ภายในบล็อก เพิ่มการเรียก actions พร้อมพารามิเตอร์ Lane สามารถเรียก lanes อื่นตามชื่อ ในการรัน ให้เรียกใช้ fastlane ชื่อ ในเทอร์มินัลจากรากของโปรเจกต์ ซึ่งมีไดเรกทอรี fastlane ที่มี Fastfile
พารามิเตอร์ถูกส่งผ่าน บรรทัดคำสั่ง: fastlane build scheme:App version:2.0 ภายใน lane พารามิเตอร์สามารถเข้าถึงได้ผ่าน options[:scheme] และ options[:version] สำหรับพารามิเตอร์ที่จำเป็น ให้ตรวจสอบการมีอยู่ของค่าที่จุดเริ่มต้นของ lane สำหรับพารามิเตอร์ที่ไม่บังคับ ให้กำหนดค่าเริ่มต้น
Private lane — lane ที่ประกาศผ่าน private_lane แทน lane ไม่สามารถรันโดยตรงจากบรรทัดคำสั่งและใช้เพื่อห่อหุ้มขั้นตอนที่ซ้ำกันซึ่งถูกเรียกจาก lanes อื่น ซึ่งลดการซ้ำซ้อนของโค้ดและทำให้การบำรุงรักษา Fastfile ง่ายขึ้น
ใช้ บล็อก error ทั่วโลกหรือภายใน lane เฉพาะเพื่อจับข้อยกเว้น Fastlane ส่งชื่อ lane และออบเจกต์ exception ไปยังบล็อก ภายในบล็อก คุณสามารถส่งการแจ้งเตือน เขียนล็อก หรือดำเนินการล้างข้อมูล ใช้ UI.user_error! เพื่อสร้างข้อความข้อผิดพลาดที่เข้าใจได้
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม