Fastfile คือไฟล์การกำหนดค่าของ Fastlane ที่เขียนด้วยภาษา Ruby ซึ่งกำหนดสคริปต์อัตโนมัติสำหรับการสร้างภาพทดสอบและจัดส่งแอปพลิเคชันบนมือถือ ไฟล์จะอยู่ในไดเรกทอรีย์ fastlane ในรากโครงการและประกอบด้วยการประกาศ lanes ซึ่งเป็นลำดับของการกระทำที่มีชื่อเรียก ตามข้อมูลจาก Fastlane Docs, 2025 โครงการส่งมือถือมากกว่า 70% ใช้ Fastfile สำหรับกระบวนการ CI/CD Fastfile แทนที่สคริปต์ bash จำนวนมากด้วยคำอธิบายไพป์ไลน์แบบแสดงเดียวเดียว
หัวข้อหลัก
Fastfile คือไฟล์การกำหนดค่าหลักของ Fastlane ที่เขียนด้วยภาษา Ruby และวางไว้ในไดเรกทอรีย์ fastlane ในรากโครงการ ไฟล์นี้กำหนดสคริปต์อัตโนมัติทั้งหมด (lanes) สำหรับการสร้างภาพทดสอบลงนามโค้ดและจัดส่งแอปพลิเคชัน Fastfile แทนที่สคริปต์ bash จำนวนมาก Makefile และคำแนะนำแบบเรียกใช้ด้วยคำอธิบาย CI/CD pipeline แบบแสดงเดียวเดียว
ความจำเป็นของ Fastfile เกิดขึ้นเมื่อโครงการต้องการสร้างภาพที่สามารถทำซ้ำได้บนเครื่องแต่งต่างๆ ของนักพัฒนาและเซิร์ฟเวอร์ CI/CD แทนที่จะให้นักพัฒนาแต่ละคนตั้งค่าสภาพแวดล้อมด้วยตนเอง Fastfile จะบันทึกขั้นตอนทั้งหมดในโค้ดที่สามารถควบคุมรุ่นใน Git ตรวจสอบได้และนำกลับใช้ระหว่างโครงการ Fastfile เดียว รับประกันว่าการสร้างภาพบนเครื่องของนักพัฒนาเหมือนกับการสร้างภาพบนเซิร์ฟเวอร์ CI/CD
Fastfile รองรับ แพลตฟอร์ม ผ่านคำสั่ง default_platform ใน Fastfile เดียวสามารถอธิบายสคริปต์สำหรับ iOS Android และ macOS โดยการจัดกลุ่มในบล็อก platform :ios และ platform :android นี่มีประโยชน์โดยเฉพาะสำหรับโครงการข้ามแพลตฟอร์มที่ iOS และ Android มีตรรกะการเป็นไปส่งที่เหมือนกันแต่มีเครื่องมือการสร้างภาพแตกต่างกัน
Fastfile ประกอบด้วยสามส่วนหลัก: การประกาศแพลตฟอร์ม (default_platform) การกำหนด lanes และการตั้งค่าฟังก์ชันช่วยเหลือ แต่ละ lane เริ่มต้นด้วยคำหลัก lane ตามด้วยชื่อสคริปต์ (Ruby symbol) โครงสร้างหลักที่มีลำดับ actions และบล็อกการจัดการข้อผิดพลาด error success หรือ ensure
Actions ใน Fastfile คือการเรียกฟังก์ชันในตัวของ Fastlane ด้วยพารามิเตอร์ในรูปแบบ Hash ตัวอย่างเช่น gym(scheme: 'App', export_method: 'app-store') เริ่มต้นการสร้างภาพ iOS ด้วยพารามิเตอร์ที่ระบุ แต่ละ action ส่งคืนผลลัพธ์ที่สามารถเก็บไว้ในตัวแปรและใช้ใน actions ถัดไป ซึ่งช่วยให้สามารถสร้าง ตรรกะแบ่งเงื่อนไข ภายใน lane
Fastfile รองรับ ตัวแปรสภาพแวดล้อม ผ่านกลไก ENV มาตรฐานใน Ruby ข้อมูลที่อ่อนไหว (รหัสผ่าน token คีย์) ไม่ควรถูกเก็บไว้ใน Fastfile — ให้ใช้ตัวแปรสภาพแวดล้อมของระบบ CI/CD หรือไฟล์ .env ที่ถูกเพิ่มใน .gitignore Fastlane จะโหลดไฟล์ .env จากไดเรกทอรีย์ fastlane โดยอัตโนมัติเมื่อเริ่มต้นใช้งาน
ร่วมกับ Fastfile ในไดเรกทอรีย์ fastlane ยังมีไฟล์การกำหนดค่าเพิ่มเติม Appfile ประกอบด้วยตัวระบุตัวตนแอปพลิเคชัน (app_identifier) Apple ID และ Team ID — ข้อมูลนี้จะถูกแทรกใส่ในทุก action โดยอัตโนมัติช่วยลดการทำซ้ำในแต่ละ lane Matchfile เก็บการตั้งค่าสำหรับ match: URL คลัง Git ประเภทโปรไฟล์และคีย์การเข้ารหัส
การแยกการกำหนดค่าออกเป็นหลายไฟล์ช่วยให้การบำรุงโครงการที่มีสภาพแวดล้อมแตกต่างกันง่ายขึ้น ตัวอย่างเช่น สำหรับ staging และ production สามารถสร้างสาขาแยกในคลัง Matchfile หรือกำหนดค่าผ่านตัวแปรสภาพแวดล้อมในระบบ CI/CD
# โครงสร้างพื้นฐานของ Fastfile
default_platform(:ios)
lane :build_and_test do
cocoapods
scan(scheme: 'App', devices: ['iPhone 15'])
gym(scheme: 'App')
end
lane :deploy do
match(type: 'appstore')
build_and_test
pilot(skip_waiting_for_build_processing: true)
end
ไวยากรณ์ของ Fastfile ขึ้นอยู่กับ Ruby DSL (Domain Specific Language) ที่ได้รับการออกแบบโดยเฉพาะสำหรับความสามารถในการอ่านสคริปต์อัตโนมัติ Lane ถูกประกาศผ่านโครงสร้าง lane :name do ... end โดยที่ name เป็น Ruby symbol ซึ่งกลายเป็นคำสั่ง fastlane name สำหรับการทำงานจากเทอร์มินัลหรือระบบ CI/CD
ภายใน lane สามารถใช้ ตัวดำเนินเงื่อนไข ของ Ruby: if, unless, case สำหรับการแยกสาขาของตรรกะ นอกจากนี้ยังมีลูป each และ while สำหรับการประมวลผลชุดของค่า Fastlane มีเมธอดพิเศษ before_all after_all และ error block สำหรับการจัดการกับเหตุการณ์ในวงจรของ lane
พารามิเตอร์ของ lane จะถูกส่งผ่าน options hash เมื่อรัน fastlane build --option_name value ค่าจะไปยัง options[:option_name] ภายใน lane สามารถตั้งค่าเริ่มต้นผ่าน optional: true และการตรวจสอปชนิด type สำหรับการควบคุมประเภทของพารามิเตอร์ที่ส่งมา
# Lane พร้อมพารามิเตอร์และตรรกะแบ่งเงื่อนไข
lane :build do |options|
scheme = options[:scheme] || 'App'
export_method = options[:export_method] || 'development'
match(type: export_method)
if export_method == 'appstore'
gym(scheme: scheme, export_method: 'app-store')
pilot(skip_waiting_for_build_processing: true)
else
gym(scheme: scheme, export_method: export_method)
end
end
Fastfile ที่สมบูรณ์สำหรับโครงการ iOS ประกอบด้วย lanes สำหรับการติดตั้งโปรแกรมการทดสอบการสร้างภาพและการประกาศใน TestFlight และ App Store มาดูตัวอย่างที่ครอบคลุมกระบวนการ CI/CD ทั่วไปตั้งแต่ commit ไปจนถึงการเผยแพร่ใน TestFlight สำหรับการทดสอบภายใน
# Fastfile สำหรับ CI/CD iOS
default_platform(:ios)
before_all do
cocoapods(try_repo_update_on_error: true)
setup_travis if ENV['TRAVIS']
end
lane :tests do
scan(
scheme: 'App',
devices: ['iPhone 15', 'iPad Pro 12.9'],
output_directory: './test_reports'
)
end
lane :build_appstore do
match(type: 'appstore', readonly: true)
gym(
scheme: 'App',
export_method: 'app-store',
include_bitcode: true
)
end
lane :deploy_testflight do
build_appstore
pilot(
skip_waiting_for_build_processing: true,
distribute_external: false
)
slack(
message: 'บิลด์ถูกอัปโหลดไปยัง TestFlight เพื่อการทดสอบภายใน'
)
end
ในตัวอย่างนี้ before_all block จะทำงานก่อนแต่ละ lane และติดตั้งโปรแกรม Lane tests จะรันการทดสอบ UI และ Unit บนสองเครื่อง Lane build_appstore จะลงนามโค้ดผ่าน match และสร้าง IPA ด้วย bitcode Lane deploy_testflight จะรวมขั้นตอนทั้งหมดสำหรับการจัดส่งที่สมบูรณ์
โครงการที่มีหลาย target (แอปพลิเคชันหลัก watchOS widget Notification Service Extension) จำเป็นต้องมี lanes แยกสำหรับแต่ละ target ใน Fastfile สามารถสร้าง lane :deploy_target ที่เป็นสากลสามารถรับชื่อโครงสร้างและเส้นทางของ build เป็นพารามิเตอร์ ซึ่งช่วยให้สามารถรันการประกาศสำหรับส่วนขยายทั้งหมดผ่าน fastlane deploy_target scheme:Widget
สำหรับการจัดระบบหลาย target ใช้อาร์เรย์ของโครงสร้างและลูป each ภายใน lane Fastlane รองรับการสร้างภาพแบบขนานอมของหลายโครงสร้างผ่านแฟลก parallel: true ซึ่งช่วยลดเวลาโดยรวมของ CI/CD pipeline สำหรับแอปพลิเคชันที่มีส่วนขยาย
Fastfile สำหรับโครงการ Android ใช้ gradle action สำหรับการรันงาน Gradle และ supply action สำหรับการเผยแพร่ใน Google Play ต่างจาก iOS ตรงกันข้าม Android ไม่ต้องใช้ match แต่ใช้ Keystore สำหรับการลงนาม ซึ่งถูกเก็บไว้นอกคลังและส่งผ่านตัวแปรสภาพแวดล้อม
# Fastfile สำหรับ CI/CD Android
default_platform(:android)
lane :build_release do
gradle(task: 'clean')
gradle(task: 'bundleRelease')
gradle(task: 'assembleRelease')
end
lane :deploy_internal do
build_release
supply(
track: 'internal',
aab: 'app/build/outputs/bundle/release/app-release.aab',
release_status: 'completed'
)
end
สำหรับการลงนาม Android ให้ตั้งค่า signingConfigs ใน build.gradle และส่งพารามิเตอร์ Keystore ผ่านตัวแปรสภาพแวดล้อม: ANDROID_KEYSTORE_PATH, ANDROID_KEYSTORE_PASSWORD, ANDROID_KEY_ALIAS และ ANDROID_KEY_PASSWORD Fastlane จะใช้ apksigner ของระบบสำหรับการลงนาม AAB หรือ APK ที่สร้างเสร็จแล้ว
สำหรับการตั้งค่าการลงนาม Android ใน Fastfile ใช้ action sign_android หรืออาศัย signingConfigs ใน build.gradle Fastlane ทำงานร่วมกับ apksigner ผ่าน Gradle — การส่งแฟลก SIGNING_CONFIG ใน gradle task จะเปิดใช้งานการลงนามด้วยพารามิเตอร์จากตัวแปรสภาพแวดล้อม ซึ่งช่วยให้สามารถลงนามไฟล์ AAB ก่อนการอัปโหลดไปยัง Google Play Console
สำหรับการเก็บ Keystore อย่างปลอดภัยใน CI/CD ใช้การเข้ารหัสแบบ Base64 และตัวแปรสภาพแวดล้อม Fastlane รองรับ action setup_keystore ที่จะถอดรหัส Keystore จากตัวแปรและเก็บไว้ในไฟล์ชั่วคราวในขั้นตอน before_all หลังจากลันเสร็จ lane ไฟล์ชั่วคราวจะถูกลบอัตโนมัติเพื่อป้องกันการรั่วไหลของใบรับรอง
Private lanes (สคริปต์ส่วนตัว) คือ lanes ที่ไม่สามารถเรียกใช้โดยตรงจากคำสั่งลับแต่สามารถเรียกใช้จาก lanes อื่นภายใน Fastfile Private lane ถูกประกาศผ่านโครงสร้าง private_lane :name do ... end และใช้สำหรับการหุ้มขั้นตอนที่ทำซ้ำซึ่งไม่มีความหมายเป็นสคริปต์อิสระ
Private lanes เหมาะสำหรับการจับกลุ่มตรรกะที่ทำซ้ำ: การติดตั้งโปรแกรมการตั้งค่าสภาพแวดล้อมการส่งการแจ้งเตือน ตัวอย่างเช่น สามารถสร้าง private lane :setup_signing ที่เรียกใช้จากหลาย lanes การประกาศแต่ไม่ควรเปิดให้นักพัฒนาเรียกใช้โดยตรงเพื่อหลีกเลี่ยงข้อผิดพลาด
# Private lane และการจับกลุ่ม
default_platform(:ios)
private_lane :setup_signing do |options|
match(
type: options[:type],
readonly: true,
verbose: false
)
end
lane :beta do
setup_signing(type: 'adhoc')
gym(export_method: 'ad-hoc')
pilot(distribute_external: true)
end
lane :release do
setup_signing(type: 'appstore')
gym(export_method: 'app-store')
deliver(
force: true,
submit_for_review: true
)
end
การจับกลุ่ม lanes ผ่าน platform blocks ช่วยให้สามารถแยกสคริปต์สำหรับ iOS และ Android ใน Fastfile เดียวกัน โครงสร้าง platform :ios do ... end และ platform :android do ... end จะแยก lanes ของแพลตฟอร์มนั้น ส่วน private lanes ทั่วไปสามารถวางไว้นอกบล็อกแพลตฟอร์มเพื่อนำกลับมาใช้ใหม่
กลไกของพารามิเตอร์ใน Fastfile ทำให้ lanes มีความยืดหยุ่นและสามารถนำกลับมาใช้ใหม่ได้ พารามิเตอร์จะถูกส่งตอนรันผ่านคำสั่งลับ: fastlane build scheme:App export_method:appstore ภายใน lane ค่าต่างๆ สามารถเข้าถึงได้ผ่าน options hash ที่ถูกส่งไปยัง lane block เป็นอาร์กิวเมนต์
Fastlane รองรับพารามิเตอร์ที่มีชนิดข้อมูลพร้อมการตรวจสอบผ่าน OptionalHash สามารถตั้งค่าชนิดของค่า (String Boolean Integer) ค่าเริ่มต้นและรายละเอียดสำหรับการสร้างเอกสารโดยอัตโนมัติ นอกจากนี้ยังมีตัวแปรสภาพแวดล้อมเป็นวิธีทางเลือกสำหรับการส่งพารามิเตอร์ ซึ่งสะดวกสำหรับระบบ CI/CD
# พารามิเตอร์ที่มีการตรวจสอบชนิด
lane :build do |options|
gym(
scheme: options[:scheme],
export_method: options[:export_method] || 'development',
include_bitcode: options[:include_bitcode] || false,
output_name: options[:output_name]
)
slack(message: "การสร้าง #{options[:scheme]} เสร็จสมบูรณ์")
end
# คำสั่ง: fastlane build scheme:MyApp export_method:appstore
ควรใช้ค่าเริ่มต้นสำหรับพารามิเตอร์ที่ไม่จำเป็นเพื่อให้ lane สามารถรันได้โดยไม่ต้องระบุทุกอาร์กิวเมนต์ สำหรับพารามิเตอร์ที่จำเป็น ให้ตรวจสอบค่าตั้งแต่ต้น lane และหยุดการทำงานด้วยข้อความผิดพลาดที่เข้าใจง่ายผ่าน UI.user_error!
คำถามที่พบบ่อย
Fastfile คือไฟล์การกำหนดค่าของ Fastlane ที่เขียนด้วย Ruby ซึ่งกำหนดสคริปต์อัตโนมัติสำหรับการสร้างภาพทดสอบและจัดส่งแอปพลิเคชัน iOS และ Android ไฟล์จะอยู่ในไดเรกทอรีย์ fastlane และประกอบด้วย lanes ซึ่งเป็นลำดับการกระทำที่มีชื่อสำหรับกระบวนการ CI/CD
สร้างไดเรกทอรีย์ fastlane ในรากโครงการและไฟล์ Fastfile เพิ่ม default_platform(:ios) ประกาศ lane ชื่อ :build ภายในเรียก cocoapods สำหรับติดตั้งโปรแกรมและ gym สำหรับการสร้างภาพ รันผ่าน fastlane build จากเทอร์มินัลในรากโครงการ
Private lane ถูกประกาศผ่าน private_lane แทนที่ lane และไม่สามารถเรียกใช้โดยตรงจากคำสั่งลับ โดยจะเรียกใช้ได้เฉพาะจาก lanes อื่นภายใน Fastfile ใช้สำหรับการหุ้มขั้นขั้นตอนที่ทำซ้ำซึ่งไม่มีความหมายเป็นสคริปต์อิสระ
พารามิเตอร์จะถูกส่งผ่านคำสั่งลับ fastlane build scheme:App และสามารถเข้าถึงได้ภายใน lane ผ่าน options hash สามารถตั้งค่าเริ่มต้นผ่านตัวดำเนิน || และสำหรับพารามิเตอร์ที่จำเป็นให้ตรวจสอบค่าผ่าน raise หรือ UI.user_error! ตั้งแต่ต้น lane
Fastfile ควรอยู่ในไดเรกทอรีย์ fastlane ในรากโครงการ ตัวอย่าง: /Users/user/projects/MyApp/fastlane/Fastfile Fastlane จะค้นหาไฟล์โดยอัตโนมัติเมื่อรันจากรากโครงการ ในไดเรกทอรีย์เดียวกันอาจมี Appfile Matchfile และไฟล์การกำหนดค่าอื่นๆ
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม