เชนเซเช เชซเชพเชธเซเชเชฒเซเชจเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชฎเซเชฌเชพเชเชฒ เชเชชเซเชฒเชฟเชเซเชถเชจเซเชธ เชฎเชพเชเซ เชธเชคเชค เชเชเซเชเชฐเชฃ เช
เชจเซ เชตเชฟเชคเชฐเชฃ เชตเชฟเชถเซ เชตเชพเชค เชเชฐเชตเชพ เชฎเชพเชเชเซ เชเซเช. เช
เชฎเซ เชคเชฎเชพเชฎ เชฎเซเชฌเชพเชเชฒ เชเชชเซเชฒเชฟเชเซเชถเชจเซเชธ เชชเชฐ CI/CD เชเซเชตเซ เชฐเซเชคเซ เชฒเชพเชเซ เชเชฐเซเช เชเซเช, เช
เชฎเซ เชคเซเชฏเชพเช เชเซเชตเซ เชฐเซเชคเซ เชชเชนเซเชเชเซเชฏเชพ เช
เชจเซ เช
เชเชคเซ เชถเซเช เชฅเชฏเซเช.
เชเซเชฒ เชชเชฐเชจเชพ เชจเซเชเชตเชฐเซเช เชชเชฐ เชชเชนเซเชฒเซเชฅเซ เช เชชเซเชฐเชคเซ เชธเชพเชฎเชเซเชฐเซ เชเซ, เชเซเชจเซ เช เชฎเชพเชฐเซ เชชเชพเชธเซ เชถเชฐเซเชเชคเชฎเชพเช เช เชญเชพเชต เชนเชคเซ, เชคเซเชฅเซ เชนเซเช เชเชฐเชพเชฆเชพเชชเซเชฐเซเชตเช เชเซเชฒเชจเซเช เชตเชฟเชเชคเชตเชพเชฐ เชตเชฐเซเชฃเชจ เชเชฐเซเชถ เชจเชนเซเช, เชชเชฐเชเชคเซ เชคเซ เชธเชฎเชฏเซ เช เชฎเชพเชฐเซ เชชเชพเชธเซ เชเซ เชนเชคเซเช เชคเซเชจเซ เช เชธเชเชฆเชฐเซเชญ เชเชชเซเชถ:
เช เชงเชฟเชเซเชค เชซเชพเชธเซเชเชฒเซเชจ เชฆเชธเซเชคเชพเชตเซเชเซเชเชฐเชฃ เช เชจเซเชฏ เชเชเชชเชจเซเชเชจเชพ เชเชฆเชพเชนเชฐเชฃเซ เช เชฎเซ เชซเชพเชธเซเชเชฒเซเชจเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ iOS เชเชชเซเชฒเชฟเชเซเชถเชจเชจเซ เชเชธเซเชฎเซเชฌเชฒเซเชจเซ เชธเซเชตเชเชพเชฒเชฟเชค เชเชฐเซเช เชเซเช
เชฒเซเชเชฎเชพเช เชฌเซ เชญเชพเชเซ เชเซ:
- เชเชเชชเชจเซเชฎเชพเช เชฎเซเชฌเชพเชเชฒ เชธเซเชเช/เชธเซเชกเซเชจเชพ เชเชฆเชญเชตเชจเซ เชชเซเชทเซเช เชญเซเชฎเชฟ
- เชเชจ-เชเชชเซเชฒเชฟเชเซเชถเชจ เชฎเชพเชเซ CI/CD เชฐเซเชฒ เชเชเช เชเชฐเชตเชพ เชฎเชพเชเซ เชเซเชเชจเชฟเชเชฒ เชธเซเชฒเซเชฏเซเชถเชจ
เชชเซเชฐเชฅเชฎ เชญเชพเช เชเซเชจเชพ เชฆเชฟเชตเชธเซ เชฎเชพเชเซ เชตเชงเซ เชจเซเชธเซเชเชพเชฒเซเชเชฟเชฏเชพ เชเซ, เช เชจเซ เชฌเซเชเซ เชเช เช เชจเซเชญเชต เชเซ เชเซ เชคเชฎเซ เชคเชฎเชพเชฐเซ เชเชพเชคเชจเซ เชฒเชพเชเซ เชเชฐเซ เชถเชเซ เชเซ.
เชเชคเชฟเชนเชพเชธเชฟเช เชฐเซเชคเซ เช เชฐเซเชคเซ เชฅเชฏเซเช
เชตเชฐเซเชท 2015
เช
เชฎเซ เชนเชฎเชฃเชพเช เช เชฎเซเชฌเชพเชเชฒ เชเชชเซเชฒเชฟเชเซเชถเชจเซ เชตเชฟเชเชธเชพเชตเชตเชพเชจเซเช เชถเชฐเซ เชเชฐเซเชฏเซเช, เชชเชเซ เช
เชฎเชจเซ เชธเชคเชค เชเชเซเชเชฐเชฃ เชตเชฟเชถเซ, DevOps เช
เชจเซ เช
เชจเซเชฏ เชซเซเชถเชจเซเชฌเชฒ เชตเชธเซเชคเซเช เชตเชฟเชถเซ เชเชเชเชชเชฃ เชเชฌเชฐ เชจ เชนเชคเซ. เชฆเชฐเซเช เชเชชเซเชฒเซเชเซเชถเชจ เช
เชชเชกเซเช เชกเซเชตเชฒเชชเชฐ เชฆเซเชตเชพเชฐเชพ เชชเซเชคเซ เชคเซเชจเชพ เชฎเชถเซเชจเชฎเชพเชเชฅเซ เชฐเซเชฒเชเชเช เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชนเชคเซ. เช
เชจเซ เชเซ Android เชฎเชพเชเซ เชคเซ เชเชเชฆเชฎ เชธเชฐเชณ เชเซ - เชเชธเซเชฎเซเชฌเชฒ, เชธเชนเซ เชเชฐเซเชฒ .apk
เช
เชจเซ เชคเซเชจเซ Google เชกเซเชตเชฒเชชเชฐ เชเชจเซเชธเซเชฒ เชชเชฐ เช
เชชเชฒเซเชก เชเชฐเซเชฏเซเช, เชชเชเซ iOS เชฎเชพเชเซ Xcode เชฆเซเชตเชพเชฐเชพ เชคเชคเซเชเชพเชฒเซเชจ เชตเชฟเชคเชฐเชฃ เชธเชพเชงเชจเช เช
เชฎเชจเซ เชธเชพเชฐเซ เชธเชพเชเช เชเซเชกเซ เชฆเซเชงเซ - เชเชฐเซเชเชพเชเชต เชกเชพเชเชจเชฒเซเชก เชเชฐเชตเชพเชจเชพ เชชเซเชฐเชฏเชพเชธเซ เชเชฃเซเชตเชพเชฐ เชญเซเชฒเซเชฎเชพเช เชธเชฎเชพเชชเซเชค เชฅเชฏเชพ เช
เชจเซ เช
เชฎเชพเชฐเซ เชซเชฐเซเชฅเซ เชชเซเชฐเชฏเชพเชธ เชเชฐเชตเซ เชชเชกเซเชฏเซ. เชคเซ เชฌเชนเชพเชฐ เชเชตเซเชฏเซเช เชเซ เชเซ เชธเซเชฅเซ เช
เชฆเซเชฏเชคเชจ เชตเชฟเชเชพเชธเชเชฐเซเชคเชพ เชฎเชนเชฟเชจเชพเชฎเชพเช เชเชฃเซ เชตเชเชค เชเซเชก เชฒเชเชคเซ เชจเชฅเซ, เชชเชฐเชเชคเซ เชเชชเซเชฒเชฟเชเซเชถเชจเชจเซ เชฐเชฟเชฒเซเช เชเชฐเซ เชเซ.
เชตเชฐเซเชท 2016
เช เชฎเซ เชฎเซเชเชพ เชฅเชฏเชพ เชเซเช, เช เชฎเชพเชฐเซ เชชเชพเชธเซ เชชเชนเซเชฒเชพเชฅเซ เช เชตเชฟเชเชพเชธเชเชฐเซเชคเชพเชเชจเซ เชชเซเชฐเชเชพเชถเชจ เชฎเชพเชเซ เชเชเชพ เชฆเชฟเชตเชธเชฅเซ เชเซเชตเซ เชฐเซเชคเซ เชฎเซเชเซเชค เชเชฐเชตเซเช เชคเซ เชตเชฟเชถเซเชจเชพ เชตเชฟเชเชพเชฐเซ เชนเชคเชพ, เช เชจเซ เชฌเซเชเซ เชเชชเซเชฒเชฟเชเซเชถเชจ เชชเชฃ เชเชตเซ, เชเซเชฃเซ เช เชฎเชจเซ เชซเชเซเชค เชเชเซเชฎเซเชถเชจ เชคเชฐเชซ เชตเชงเซ เชฆเชฌเชพเชฃ เชเชฐเซเชฏเซเช. เชคเซ เช เชตเชฐเซเชทเซ, เช เชฎเซ เชชเซเชฐเชฅเชฎ เชตเชเชค เชเซเชจเชเชฟเชจเซเชธ เชเชจเซเชธเซเชเซเชฒ เชเชฐเซเชฏเซเช เช เชจเซ เชกเชฐเชพเชฎเชฃเซ เชธเซเชเซเชฐเชฟเชชเซเชเซเชธเชจเซ เชธเชฎเซเชน เชฒเชเซเชฏเซ, เชเซ เชซเชพเชธเซเชเชฒเซเชจ เชคเซเชจเชพ เชฆเชธเซเชคเชพเชตเซเชเซเชเชฐเชฃเชฎเชพเช เชฆเชฐเซเชถเชพเชตเซ เชเซ เชคเซเชจเชพ เชเซเชตเซ เช เชเซ.
$ xcodebuild clean archive -archivePath build/MyApp
-scheme MyApp
$ xcodebuild -exportArchive
-exportFormat ipa
-archivePath "build/MyApp.xcarchive"
-exportPath "build/MyApp.ipa"
-exportProvisioningProfile "ProvisioningProfileName"
$ cd /Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/
$ ./altool โupload-app
-f {abs path to your project}/build/{release scheme}.ipa
-u "[email protected]"
-p "PASS_APPLE_ID"
เชเชฎเชจเชธเซเชฌเซ, เช เชคเซเชฏเชพเชฐ เชธเซเชงเซ เชซเชเซเชค เช เชฎเชพเชฐเชพ เชตเชฟเชเชพเชธเชเชฐเซเชคเชพเช เช เชเชพเชฃเชคเชพ เชนเชคเชพ เชเซ เช เชธเซเชเซเชฐเชฟเชชเซเชเซ เชเซเชตเซ เชฐเซเชคเซ เชเชพเชฎ เชเชฐเซ เชเซ เช เชจเซ เชถเชพ เชฎเชพเชเซ เชเซเชจเชพ เช เช เชจเชเชค เชธเซเชเซเชเชจเซ เชเชฐเซเชฐ เชเซ, เช เชจเซ เชเซเชฏเชพเชฐเซ เชเชเชเช เชซเชฐเซเชฅเซ เชคเซเชเซ เชเชฏเซเช, เชคเซเชฏเชพเชฐเซ เชคเซเชฎเชจเซ เชฒเซเชเซเชธเชจเซเช เชตเชฟเชถเซเชฒเซเชทเชฃ เชเชฐเชตเชพ เชฎเชพเชเซ "เชญเชตเซเชฏ เชธเชพเชเช" เชฎเชณเซ.
เชตเชฐเซเชท 2017
เช เชตเชฐเซเชทเซ เช เชฎเซ เชถเซเชเซเชฏเชพ เชเซ เชซเชพเชธเซเชเชฒเซเชจ เชเซเชตเซ เชตเชธเซเชคเซ เชเซ. เช เชคเซเชฏเชพเชฐเซ เชเซ เชคเซเชเชฒเซ เชฎเชพเชนเชฟเชคเซ เชจ เชนเชคเซ - เชเช เชเซเชตเซ เชฐเซเชคเซ เชถเชฐเซ เชเชฐเชตเซ, เชคเซเชจเซ เชเชชเชฏเซเช เชเซเชตเซ เชฐเซเชคเซ เชเชฐเชตเซ. เช เชจเซ เชคเซ เชธเชฎเชฏเซ เชเซเชฒ เชชเซเชคเซ เชนเชเซ เชชเชฃ เชเซเชฐเซเชก เชนเชคเซเช: เชธเชคเชค เชญเซเชฒเซเช เช เช เชฎเชจเซ เชจเชฟเชฐเชพเชถ เชเชฐเซเชฏเชพ เช เชจเซ เชคเซเชเช เชตเชเชจ เชเชชเซเชฒเชพ เชเชพเชฆเซเช เชเชเซเชฎเซเชถเชจเชฎเชพเช เชตเชฟเชถเซเชตเชพเชธ เชเชฐเชตเซ เชฎเซเชถเซเชเซเชฒ เชนเชคเซเช.
เชเซ เชเซ, เชซเชพเชธเซเชเชฒเซเชจ เชเซเชฐเชฎเชพเช เชธเชฎเชพเชตเชฟเชทเซเช เชฎเซเชเซเชฏ เชเชชเชฏเซเชเชฟเชคเชพเช เชเซ gym
ะธ pilot
, เช
เชฎเซ เชคเซเชจเซ เชถเชฐเซ เชเชฐเชตเชพเชฎเชพเช เชธเชซเชณ เชฅเชฏเชพ.
เช เชฎเชพเชฐเซ เชธเซเชเซเชฐเชฟเชชเซเชเชฎเชพเช เชฅเซเชกเซ เชธเซเชงเชพเชฐเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเซ เชเซ.
$ fastlane gym โ-workspace "Example.xcworkspace"
--scheme "AppName"
โ-buildlog_path "/tmp"
-โclean
เชคเซเช เชธเซเชงเชพเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเชพ เชเซ, เชเซ เชฎเชพเชคเซเชฐ เชเชเชฒเชพ เชฎเชพเชเซ เชเซ เชฌเชงเชพ เชชเชฐเชฟเชฎเชพเชฃเซ เชฎเชพเชเซ เชเชฐเซเชฐเซ เชจเชฅเซ xcodebuild
, เชคเชฎเชพเชฐเซ เชธเซเชเชตเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ - gym
เชเซเชฏเชพเช เช
เชจเซ เชถเซเช เชเซ เชคเซ เชธเซเชตเชคเชเชคเซเชฐ เชฐเซเชคเซ เชธเชฎเชเชถเซ. เช
เชจเซ เชตเชงเซ เชซเชพเชเชจ-เชเซเชฏเซเชจเชฟเชเช เชฎเชพเชเซ, เชคเชฎเซ เชฎเชพเช เชเซเชตเซ เช เชเซเชจเซ เชเชฒเซเชฒเซเช เชเชฐเซ เชถเชเซ เชเซ xcodebuild
, เชซเชเซเชค เชเซเชจเซเช เชจเชพเชฎเชเชฐเชฃ เชธเซเชชเชทเซเช เชเซ.
เช เชตเชเชคเซ, เชเซเชฎ เช เชจเซ เชฌเชฟเชฒเซเช-เชเชจ xcpretty เชซเซเชฐเซเชฎเซเชเชฐเชจเซ เชเชญเชพเชฐเซ, เชฌเชฟเชฒเซเชก เชฒเซเชเซเชธ เชตเชงเซ เชธเซเชตเชพเชเซเชฏ เชฌเชจเซ เชเชฏเชพ เชเซ. เชเชจเชพเชฅเซ เชคเซเชเซเชฒเซ เชเชธเซเชฎเซเชฌเชฒเซเชเชจเซ เช เซเช เชเชฐเชตเชพเชฎเชพเช เชธเชฎเชฏ เชฌเชเชพเชตเชตเชพเชจเซเช เชถเชฐเซ เชฅเชฏเซเช, เช เชจเซ เชเซเชเชฒเซเชเชตเชพเชฐ เชฐเซเชฒเซเช เชเซเชฎ เชคเซเชจเซ เชเชพเชคเซ เช เชถเซเชงเซ เชถเชเซ เชเซ.
เชเชฎเชจเชธเซเชฌเซ, เชเชธเซเชฎเซเชฌเชฒเซ เชเชกเชช เชฎเชพเชชเชจ xcodebuild
ะธ gym
เช
เชฎเซ เชคเซ เชเชฐเซเชฏเซเช เชจเชฅเซ, เชชเชฐเชเชคเซ เช
เชฎเซ เชฆเชธเซเชคเชพเชตเซเชเซเชเชฐเชฃ เชชเชฐ เชตเชฟเชถเซเชตเชพเชธ เชเชฐเซเชถเซเช - 30% เชธเซเชงเซเชจเซ เชเชกเชช.
เชฌเชงเซ เช เชฐเชเซเช เชฎเชพเชเซ เชเช เชชเซเชฐเชเซเชฐเชฟเชฏเชพ
เชตเชฐเซเชท 2018 เช เชจเซ เชตเชฐเซเชคเชฎเชพเชจ
2018 เชธเซเชงเซเชฎเชพเช, เชเชชเซเชฒเชฟเชเซเชถเชจเซ เชฌเชจเชพเชตเชตเชพ เช เชจเซ เชฐเซเชฒเชเชเช เชเชฐเชตเชพเชจเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชธเชเชชเซเชฐเซเชฃเชชเชฃเซ เชเซเชจเชเชฟเชจเซเชธ เชชเชฐ เชเชธเซเชกเชตเชพเชฎเชพเช เชเชตเซ, เชตเชฟเชเชพเชธเชเชฐเซเชคเชพเชเช เชคเซเชฎเชจเชพ เชฎเชถเซเชจเซเชฎเชพเชเชฅเซ เชฐเชฟเชฒเซเช เชเชฐเชตเชพเชจเซเช เชฌเชเชง เชเชฐเซ เชฆเซเชงเซเช, เช เชจเซ เชซเชเซเชค เชฐเชฟเชฒเซเช เชเซเชฎเชจเซ เช เชฐเชฟเชฒเซเช เชเชฐเชตเชพเชจเซ เช เชงเชฟเชเชพเชฐ เชนเชคเซ.
เช เชฎเซ เชชเชนเซเชฒเชพเชฅเซ เช เชชเชฐเซเชเซเชทเชฃเซ เช เชจเซ เชธเซเชฅเชฟเชฐ เชตเชฟเชถเซเชฒเซเชทเชฃเชจเชพ เชชเซเชฐเชพเชฐเชเชญเชฎเชพเช เชธเซเชงเชพเชฐเซ เชเชฐเชตเชพ เชเชเซเชเชคเชพ เชนเชคเชพ, เช เชจเซ เช เชฎเชพเชฐเซ เชธเซเชเซเชฐเชฟเชชเซเชเซ เชตเชฟเชเชธเชคเซ เช เชจเซ เชตเชงเชคเซ เชเช. เช เชฎเชพเชฐเซ เชเชชเซเชฒเชฟเชเซเชถเชจเซ เชธเชพเชฅเซ เชตเชงเซเชฏเชพ เช เชจเซ เชฌเชฆเชฒเชพเชฏเชพ. เชคเซ เชธเชฎเชฏเซ เชฒเชเชญเช 10 เชเชชเซเชฒเชฟเชเซเชถเชจ เชนเชคเซ. เช เชฎเชพเชฐเซ เชชเชพเชธเซ เชฌเซ เชชเซเชฒเซเชเชซเซเชฐเซเชฎ เชเซ เชคเซ เชงเซเชฏเชพเชจเชฎเชพเช เชฒเซเชคเชพ, เชคเซ เชฒเชเชญเช 20 "เชเซเชตเชเชค" เชธเซเชเซเชฐเชฟเชชเซเชเซเชธ เชเซ.
เชฆเชฐ เชตเชเชคเซ เชเซเชฏเชพเชฐเซ เชเชชเชฃเซ เชธเซเชเซเชฐเชฟเชชเซเชเชฎเชพเช เชจเชตเซเช เชชเชเชฒเซเช เชเชฎเซเชฐเชตเชพ เชฎเชพเชเชเซเช เชเซเช, เชคเซเชฏเชพเชฐเซ เช เชฎเชพเชฐเซ เชคเชฎเชพเชฎ เชถเซเชฒ เชธเซเชเซเชฐเชฟเชชเซเชเซเชธเชฎเชพเช เชเซเชเชกเชพเช เชเซเชชเซ-เชชเซเชธเซเช เชเชฐเชตเชพ เชชเชกเชถเซ. เชเชฆเชพเช เช เชฎเซ เชตเชงเซ เชเชพเชณเชเซเชชเซเชฐเซเชตเช เชเชพเชฎ เชเชฐเซ เชถเชเซเชฏเชพ เชนเซเชค, เชชเชฐเชเชคเซ เชเชฃเซเชตเชพเชฐ เชเชตเชพ เชซเซเชฐเชซเชพเชฐเซ เชเชพเชเชชเซเชฎเชพเช เชธเชฎเชพเชชเซเชค เชฅเชพเชฏ เชเซ, เชเซ เชฐเซเชฒเซเช เชเซเชฎ เชฎเชพเชเซ เชธเซเชเซเชฐเชฟเชชเซเชเซเชธเชจเซ เช เซเช เชเชฐเชตเชพ เช เชจเซ เชเชฏเชพ เชธเซเชฎเชพเชฐเซเช เชตเซเชฏเชเซเชคเชฟเช เช เชเชฆเซเชถ เชเชฎเซเชฐเซเชฏเซ เชเซ เช เชจเซ เชคเซ เชเชฐเซเชเชฐ เชถเซเช เชเชฐเซ เชเซ เชคเซ เชถเซเชงเชตเชพ เชฎเชพเชเซ เชธเชพเชเช เชฌเชจเซ เชเชพเชฏ เชเซ. เชธเชพเชฎเชพเชจเซเชฏ เชฐเซเชคเซ, เชเชตเซเช เชเชนเซ เชถเชเชพเชฏ เชจเชนเซเช เชเซ เชเช เชชเซเชฒเซเชเชซเซเชฐเซเชฎ เชฎเชพเชเซ เชเชธเซเชฎเซเชฌเชฒเซ เชฎเชพเชเซเชจเซ เชธเซเชเซเชฐเชฟเชชเซเชเซ เชเชเชพเชฎเชพเช เชเชเซ เชเชเชเช เช เชเชถเซ เชธเชฎเชพเชจ เชนเชคเซ. เชคเซเชฎ เชเชคเชพเช เชคเซเชเช เชเซเชเซเชเชธเชชเชฃเซ เชคเซ เช เชเชฐเซเชฏเซเช.
เชจเชตเซ เชเชชเซเชฒเชฟเชเซเชถเชจ เชฎเชพเชเซเชจเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชถเชฐเซ เชเชฐเชตเชพ เชฎเชพเชเซ, เช เชธเซเชเซเชฐเชฟเชชเซเชเซเชธเชจเซเช "เชซเซเชฐเซเชถ" เชธเชเชธเซเชเชฐเชฃ เชชเชธเชเชฆ เชเชฐเชตเชพ, เชคเซเชจเซ เชกเซเชฌเช เชเชฐเชตเชพ เช เชจเซ "เชนเชพ, เชคเซ เชเชพเชฎ เชเชฐเซ เชเซ" เชเชฎ เชเชนเซเชตเชพ เชฎเชพเชเซ เชเช เชฆเชฟเชตเชธ เชชเชธเชพเชฐ เชเชฐเชตเซ เชเชฐเซเชฐเซ เชนเชคเซ.
2018 เชจเชพ เชเชจเชพเชณเชพเชฎเชพเช, เช เชฎเซ เชซเชฐเซ เชเช เชตเชพเชฐ เชนเชเซ เชชเชฃ เชตเชฟเชเชพเชธเชถเซเชฒ เชซเชพเชธเซเชเชฒเซเชจ เชคเชฐเชซ เชเซเชฏเซเช.
เชเชพเชฐเซเชฏ #1: เชคเชฎเชพเชฎ เชธเซเชเซเชฐเชฟเชชเซเช เชธเซเชเซเชชเซเชธเชจเซ เชธเชพเชฐเชพเชเชถ เชเชชเซ เช เชจเซ เชคเซเชฎเชจเซ เชซเชพเชธเซเชเชซเชพเชเชฒเชฎเชพเช เชซเชฐเซเชฅเซ เชฒเชเซ
เชเซเชฏเชพเชฐเซ เช เชฎเซ เชถเชฐเซเชเชค เชเชฐเซ, เชคเซเชฏเชพเชฐเซ เช เชฎเชพเชฐเซ เชธเซเชเซเชฐเชฟเชชเซเชเซ เชเซเชจเชเชฟเชจเซเชธเชฎเชพเช เชเช เชถเซเชฒ เชธเซเชเซเชฐเชฟเชชเซเชเชฎเชพเช เชคเชฎเชพเชฎ เชชเชเชฒเชพเช เช เชจเซ เชเซเชฐเซเชเชจเซ เชธเชฎเชพเชตเซเชถ เชเชฐเชคเซ เชซเซเชเชเซเชฒเซเชฅ เชเซเชตเซ เชฆเซเชเชพเชคเซ เชนเชคเซ. เช เชฎเซ เชนเชเซ เชธเซเชงเซ เชชเชพเชเชชเชฒเชพเชเชจ เช เชจเซ เชธเซเชเซเช เชฆเซเชตเชพเชฐเชพ เชตเชฟเชญเชพเชเชจ เชชเชฐ เชธเซเชตเชฟเช เชเชฐเซเชฏเซเช เชจเชฅเซ.
เช เชฎเซ เช เชฎเชพเชฐเซ เชชเชพเชธเซ เชถเซเช เชเซ เชคเซ เชเซเชฏเซเช เช เชจเซ เช เชฎเชพเชฐเชพ CI/CD เชจเชพ เชตเชฐเซเชฃเชจ เชธเชพเชฅเซ เชฌเชเชงเชฌเซเชธเชคเชพ 4 เชชเชเชฒเชพเช เชเชณเชเซเชฏเชพ:
- เชฌเชฟเชฒเซเชก - เชจเชฟเชฐเซเชญเชฐเชคเชพ เชธเซเชฅเชพเชชเชฟเชค เชเชฐเชตเซ, เชเชฐเซเชเชพเชเชตเชจเซ เชเชธเซเชฎเซเชฌเชฒ เชเชฐเชตเซเช,
- เชชเชฐเซเชเซเชทเชฃ - เชตเชฟเชเชพเชธเชเชฐเซเชคเชพ เชเชเชฎ เชชเชฐเซเชเซเชทเชฃเซ เชเชฒเชพเชตเชตเซเช, เชเชตเชฐเซเชเชจเซ เชเชฃเชคเชฐเซ เชเชฐเชตเซ,
- เชธเซเชจเชพเชฐ - เชฌเชงเชพ เชฒเชฟเชจเชเชฐ เชฒเซเชจเซเช เชเชฐเซ เชเซ เช เชจเซ เชธเซเชจเชพเชฐเชเซเชฏเซเชฌเชจเซ เช เชนเซเชตเชพเชฒ เชฎเซเชเชฒเซ เชเซ,
- เชกเชฟเชชเซเชฒเซเชฏ โ เชเชฒเซเชซเชพ (เชเซเชธเซเชเชซเซเชฒเชพเชเช) เชชเชฐ เชเชฐเซเชเชฟเชซเซเชเซเช เชฎเซเชเชฒเชตเซเช.
เช เชจเซ เชเซ เชคเชฎเซ เชเซเชฐเชฟเชฏเชพเชเชฎเชพเช เชเชชเชฏเซเชเชฎเชพเช เชฒเซเชตเชพเชคเซ เชเซเชจเซ เชฌเชพเชฆ เชเชฐเซเชจเซ เชตเชฟเชเชคเซเชฎเชพเช เชจ เชเชพเชต, เชคเซ เชคเชฎเชจเซ เช เชซเชพเชธเซเชเชซเชพเชเชฒ เชฎเชณเชถเซ:
default_platform(:ios)
platform :ios do
before_all do
unlock
end
desc "Build stage"
lane :build do
match
prepare_build
gym
end
desc "Prepare build stage: carthage and cocoapods"
lane :prepare_build do
pathCartfile = ""
Dir.chdir("..") do
pathCartfile = File.join(Dir.pwd, "/Cartfile")
end
if File.exist?(pathCartfile)
carthage
end
pathPodfile = ""
Dir.chdir("..") do
pathPodfile = File.join(Dir.pwd, "/Podfile")
end
if File.exist?(pathPodfile)
cocoapods
end
end
desc "Test stage"
lane :test do
scan
xcov
end
desc "Sonar stage (after run test!)"
lane :run_sonar do
slather
lizard
swiftlint
sonar
end
desc "Deploy to testflight stage"
lane :deploy do
pilot
end
desc "Unlock keychain"
private_lane :unlock do
pass = ENV['KEYCHAIN_PASSWORD']
unlock_keychain(
password: pass
)
end
end
เชตเชพเชธเซเชคเชตเชฎเชพเช, เช เชฎเชพเชฐเซ เชชเซเชฐเชฅเชฎ เชซเชพเชธเซเชเชซเชพเชเชฒ เชฐเชพเชเซเชทเชธเซ เชฌเชจเซ, เช เชฎเชจเซ เชนเชเซ เชชเชฃ เชเชฐเซเชฐเซ เชเชตเชพ เชเซเชเชฒเชพเช เชเซเชฐเซเช เช เชจเซ เช เชฎเซ เช เชตเซเชเซ เชเชฐเซเชฒ เชชเชฐเชฟเชฎเชพเชฃเซเชจเซ เชธเชเชเซเชฏเชพเชจเซ เชงเซเชฏเชพเชจเชฎเชพเช เชฒเซเชคเชพ:
lane :build do
carthage(
command: "update",
use_binaries: false,
platform: "ios",
cache_builds: true)
cocoapods(
clean: true,
podfile: "./Podfile",
use_bundle_exec: false)
gym(
workspace: "MyApp.xcworkspace",
configuration: "Release",
scheme: "MyApp",
clean: true,
output_directory: "/build",
output_name: "my-app.ipa")
end
lane :deploy do
pilot(
username: "[email protected]",
app_identifier: "com.example.app",
dev_portal_team_id: "TEAM_ID_NUMBER_DEV",
team_id: "ITS_TEAM_ID")
end
เชเชชเชฐเชจเชพ เชเชฆเชพเชนเชฐเชฃเชฎเชพเช, เชชเชฐเชฟเชฎเชพเชฃเซเชจเซ เชฎเชพเชคเซเชฐ เชเช เชญเชพเช เชเซ เชเชชเชฃเซ เชธเซเชชเชทเซเช เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ: เช เชฌเชฟเชฒเซเชก เชชเชฐเชฟเชฎเชพเชฃเซ เชเซ - เชธเซเชเซเชฎเชพ, เชฐเซเชชเชฐเซเชเชพเชเชเชจ, เชเซเชเชตเชพเช เชชเซเชฐเซเชซเชพเชเชฒ เชจเชพเชฎเซ, เชคเซเชฎเช เชตเชฟเชคเชฐเชฃ เชชเชฐเชฟเชฎเชพเชฃเซ - เชตเชฟเชเชพเชธเชเชฐเซเชคเชพ เชเชเชพเชเชจเซเชเชจเซเช Apple ID, เชชเชพเชธเชตเชฐเซเชก, เชเชชเซเชฒเชฟเชเซเชถเชจ ID, เช
เชจเซ เชคเซเชฅเซ เชชเชฐ เชชเซเชฐเชฅเชฎ เช
เชเชฆเชพเช เชคเชฐเซเชเซ, เช
เชฎเซ เช เชฌเชงเซ เชเซเชจเซ เชตเชฟเชถเชฟเชทเซเช เชซเชพเชเชฒเซเชฎเชพเช เชฎเซเชเซเช เชเซเช - Gymfile
, Matchfile
ะธ Appfile
.
เชนเชตเซ เชเซเชจเชเชฟเชจเซเชธเชฎเชพเช เชคเชฎเซ เชเซเชเชเชพ เชเชฆเซเชถเซเชจเซ เชเซเชฒ เชเชฐเซ เชถเชเซ เชเซ เชเซ เชฆเซเชถเซเชฏเชจเซ เช เชธเซเชชเชทเซเช เชเชฐเชคเชพ เชจเชฅเซ เช เชจเซ เชเชเช เชฆเซเชตเชพเชฐเชพ เชธเชฐเชณเชคเชพเชฅเซ เชตเชพเชเชเซ เชถเชเชพเชฏ เชเซ:
# fastlane ios <lane_name>
$ fastlane ios build
$ fastlane ios test
$ fastlane ios run_sonar
$ fastlane ios deploy
เชนเซเชฐเซ, เช เชฎเซ เชฎเชนเชพเชจ เชเซเช
เชคเชฎเชจเซ เชถเซเช เชฎเชณเซเชฏเซเช? เชฆเชฐเซเช เชชเชเชฒเชพ เชฎเชพเชเซ เชเชฆเซเชถเซ เชธเชพเชซ เชเชฐเซ. เชซเชพเชธเซเชเชฒเซเชจ เชซเชพเชเชฒเซเชฎเชพเช เชธเชฐเชธ เชฐเซเชคเซ เชเซเช เชตเชพเชฏเซเชฒเซ เชธเซเชเซเชฐเชฟเชชเซเชเซ เชธเชพเชซ เชเชฐเซ. เชเชจเชเชฆเชฎเชพเช, เช เชฎเซ เชตเชฟเชเชพเชธเชเชฐเซเชคเชพเชเชจเซ เชคเซเชฎเชจเซ เชฐเซเชชเซเชเซเชเชฐเซเชเชฎเชพเช เชเชฐเซเชฐเซ เชฌเชงเซเช เชเชฎเซเชฐเชตเชพ เชฎเชพเชเซ เชเชนเซเชจเซ เชฆเซเชกเซเชฏเชพ.
เชชเชฐเชเชคเซ เช เชฎเชจเซ เชธเชฎเชฏเชธเชฐ เชธเชฎเชเชพเชฏเซเช เชเซ เช เชฎเชจเซ เชธเชฎเชพเชจ เชฎเซเชถเซเชเซเชฒเซเชเชจเซ เชธเชพเชฎเชจเซ เชเชฐเชตเซ เชชเชกเชถเซ - เช เชฎเชพเชฐเซ เชชเชพเชธเซ เชนเชเซ เชชเชฃ 20 เชเชธเซเชฎเซเชฌเชฒเซ เชธเซเชเซเชฐเชฟเชชเซเชเซ เชนเชถเซ เชเซ เชเช เชฐเซเชคเซ เช เชฅเชตเชพ เชฌเซเชเซ เชฐเซเชคเซ เชชเซเชคเชพเชจเซเช เชเซเชตเชจ เชเซเชตเชตเชพเชจเซเช เชถเชฐเซ เชเชฐเชถเซ, เชคเซเชฎเชจเซ เชธเชเชชเชพเชฆเชฟเชค เชเชฐเชตเซเช เชตเชงเซ เชฎเซเชถเซเชเซเชฒ เชนเชถเซ, เชเชพเชฐเชฃ เชเซ เชธเซเชเซเชฐเชฟเชชเซเชเซ เชญเชเชกเชพเชฐเชฎเชพเช เชเชถเซ, เช เชจเซ เช เชฎเชจเซ เชคเซเชฏเชพเช เชชเซเชฐเชตเซเชถ เชจเชนเซเชคเซ. เช เชจเซ, เชธเชพเชฎเชพเชจเซเชฏ เชฐเซเชคเซ, เช เชฐเซเชคเซ เชเชชเชฃเซ เชชเซเชกเชพเชจเซ เชนเชฒ เชเชฐเชตเซ เชถเชเซเชฏ เชฌเชจเชถเซ เชจเชนเซเช.
เชเชพเชฐเซเชฏ #2: N เชเชชเซเชฒเชฟเชเซเชถเชจเซเชธ เชฎเชพเชเซ เชเช เช เชซเชพเชธเซเชเชซเชพเชเชฒ เชฎเซเชณเชตเซ
เชนเชตเซ เชเชตเซเช เชฒเชพเชเซ เชเซ เชเซ เชธเชฎเชธเซเชฏเชพ เชนเชฒ เชเชฐเชตเซ เชเชเชฒเซ เชฎเซเชถเซเชเซเชฒ เชจเชฅเซ - เชเชฒเซ เชธเซเช เชเชฐเซ เช เชจเซ เชเชพเชฒเซ เชเชเช. เชนเชพ, เชนเชเซเชเชคเชฎเชพเช, เช เชฐเซเชคเซ เชธเชฎเชธเซเชฏเชพ เชนเชฒ เชฅเช เชนเชคเซ. เชชเชฐเชเชคเซ เช เชเซเชทเชฃเซ เชเซเชฏเชพเชฐเซ เช เชฎเซ เชคเซเชจเซ เชฌเชเชพเชกเซเชฏเซเช, เชคเซเชฏเชพเชฐเซ เช เชฎเชพเชฐเซ เชชเชพเชธเซ เชจ เชคเซ เชซเชพเชธเซเชเชฒเซเชจเชฎเชพเช เช เชเซเชถเชณเชคเชพ เชนเชคเซ, เชจ เชคเซ เชฐเซเชฌเซเชฎเชพเช, เชเซเชฎเชพเช เชซเชพเชธเซเชเชฒเซเชจ เชฒเชเชพเชฏเซเชฒ เชเซ, เชจ เชคเซ เชจเซเชเชตเชฐเซเช เชชเชฐเชจเชพ เชเชชเชฏเซเชเซ เชเชฆเชพเชนเชฐเชฃเซ - เชฆเชฐเซเช เชตเซเชฏเชเซเชคเชฟ เชเซเชฃเซ เชซเชพเชธเซเชเชฒเซเชจ เชตเชฟเชถเซ เชฒเชเซเชฏเซเช เชนเชคเซเช เชคเซ เชเช เชเชชเซเชฒเชฟเชเซเชถเชจ เชฎเชพเชเซเชจเชพ เชเชฆเชพเชนเชฐเชฃ เชชเซเชฐเชคเซเช เชฎเชฐเซเชฏเชพเชฆเชฟเชค เชนเชคเซเช. เชเช เชตเชฟเชเชพเชธเชเชฐเซเชคเชพ.
เชซเชพเชธเซเชเชฒเซเชจ เชชเชฐเซเชฏเชพเชตเชฐเชฃ เชตเซเชฐเซเชเชฌเชฒเซเชธเชจเซ เชนเซเชจเซเชกเชฒ เชเชฐเซ เชถเชเซ เชเซ, เช เชจเซ เช เชฎเซ เชเซเชเซเชจ เชชเชพเชธเชตเชฐเซเชก เชธเซเช เชเชฐเซเชจเซ เชชเชนเซเชฒเชพเชฅเซ เช เชเชจเซ เชชเซเชฐเชฏเชพเชธ เชเชฐเซเชฏเซ เชเซ:
ENV['KEYCHAIN_PASSWORD']
เช เชฎเชพเชฐเซ เชธเซเชเซเชฐเชฟเชชเซเชเซ เชเซเชฏเชพ เชชเชเซ, เช เชฎเซ เชธเชพเชฎเชพเชจเซเชฏ เชญเชพเชเซเชจเซ เชเชณเชเซเชฏเชพ:
#for build, test and deploy
APPLICATION_SCHEME_NAME=appScheme
APPLICATION_PROJECT_NAME=app.xcodeproj
APPLICATION_WORKSPACE_NAME=app.xcworkspace
APPLICATION_NAME=appName
OUTPUT_IPA_NAME=appName.ipa
#app info
APP_BUNDLE_IDENTIFIER=com.example.appName
[email protected]
TEAM_ID=ABCD1234
FASTLANE_ITC_TEAM_ID=123456789
เชนเชตเซ, เชซเชพเชธเซเชเชฒเซเชจ เชซเชพเชเชฒเซเชฎเชพเช เช เชเซเชเชจเซ เชเชชเชฏเซเช เชถเชฐเซ เชเชฐเชตเชพ เชฎเชพเชเซ, เช
เชฎเชพเชฐเซ เชคเซเชฎเชจเซ เชคเซเชฏเชพเช เชเซเชตเซ เชฐเซเชคเซ เชชเชนเซเชเชเชพเชกเชตเชพ เชคเซ เชถเซเชงเชตเชพเชจเซเช เชนเชคเซเช. เชซเชพเชธเซเชเชฒเซเชจ เชชเชพเชธเซ เชเชจเซ เชเชเซเชฒ เชเซ: .env
, .env.default
, .env.development
.
เช
เชจเซ เชชเชเซ เช
เชฎเซ เช เชชเซเชธเซเชคเชเชพเชฒเชฏเชจเซ เชเชชเชฏเซเช เชฅเซเชกเซ เช
เชฒเช เชฐเซเชคเซ เชเชฐเชตเชพเชจเซเช เชจเชเซเชเซ เชเชฐเซเชฏเซเช. เชเชพเชฒเซ เชกเซเชตเชฒเชชเชฐเซเชธเชจเซ เชฐเชฟเชชเซเชเซเชเชฐเซเชฎเชพเช เชซเชพเชธเซเชเชฒเซเชจ เชธเซเชเซเชฐเชฟเชชเซเชเซเชธ เช
เชจเซ เชคเซเชจเซ เชฎเซเชเชพ เชฎเชพเชนเชฟเชคเซเชจเซ เชจเชนเซเช, เชชเชฐเชเชคเซ เชซเชพเชเชฒเชฎเชพเช เช เชเชชเซเชฒเชฟเชเซเชถเชจเชจเซ เช
เชจเชจเซเชฏ เชเชพเชตเซเช เชฎเซเชเซเช. .env.appName
.
เชชเซเชคเชพเชจเซ Fastfile
, Appfile
, Matchfile
ะธ Gymfile
, เช
เชฎเซ เชคเซเชจเซ เช
เชฒเช เชฐเซเชชเซเชเซเชเชฐเซเชฎเชพเช เชเซเชชเชพเชตเซ เชฆเซเชงเซเช เชเซ. เช
เชจเซเชฏ เชธเซเชตเชพเชเชฎเชพเชเชฅเซ เชชเชพเชธเชตเชฐเซเชก เชเซ เชธเชพเชฅเซเชจเซ เชตเชงเชพเชฐเชพเชจเซ เชซเชพเชเชฒ เชคเซเชฏเชพเช เชเซเชชเชพเชฏเซเชฒเซ เชนเชคเซ - .env
.
เชคเชฎเซ เชเช เชเชฆเชพเชนเชฐเชฃ เชเซเช เชถเชเซ เชเซ
CI เชชเชฐ, เชเซเชฒ เชตเชงเซ เชฌเชฆเชฒเชพเชฏเซ เชจเชฅเซ; เชเซเชเซเชเชธ เชเชชเซเชฒเชฟเชเซเชถเชจ เชฎเชพเชเซ เชฐเซเชชเชฐเซเชเชพเชเชเชจ เชเซ เชเชฎเซเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ:
# fastlane ios <lane_name> --env appName
$ fastlane ios build --env appName
$ fastlane ios test --env appName
$ fastlane ios run_sonar --env appName
$ fastlane ios deploy --env appName
เชเชฆเซเชถเซ เชเชฒเชพเชตเชคเชพ เชชเชนเซเชฒเชพ, เช เชฎเซ เช เชฎเชพเชฐเซ เชฐเซเชชเซเชเซเชเชฐเซเชจเซ เชธเซเชเซเชฐเชฟเชชเซเชเซ เชธเชพเชฅเซ เชฒเซเชก เชเชฐเซเช เชเซเช. เชเชเชฒเซเช เชธเชฐเชธ เชฒเชพเชเชคเซเช เชจเชฅเซ:
git clone [email protected]/FastlaneCICD.git fastlane_temp
cp ./fastlane_temp/fastlane/* ./fastlane/
cp ./fastlane_temp/fastlane/.env fastlane/.env
เช เชธเซเชฒเซเชฏเซเชถเชจเชจเซ เชนเชฎเชฃเชพเช เชฎเชพเชเซ เชเซเชกเซ เชฆเซเชงเซเช, เชเซเชเซ เชซเชพเชธเซเชเชฒเซเชจ เชชเชพเชธเซ เชซเชพเชธเซเชเชซเชพเชเชฒ เชฎเชพเชฐเชซเชคเซ เชกเชพเชเชจเชฒเซเชก เชเชฐเชตเชพ เชฎเชพเชเซเชจเซ เชเชเซเชฒ เชเซ import_from_git
, เชชเชฐเชเชคเซ เชคเซ เชฎเชพเชคเซเชฐ Fastfile เชฎเชพเชเซ เชเชพเชฎ เชเชฐเซ เชเซ, เชชเชฐเชเชคเซ เช
เชจเซเชฏ เชซเชพเชเชฒเซ เชฎเชพเชเซ เชจเชนเซเช. เชเซ เชคเชฎเซ "เชเชฐเซเชเชฐ เชธเซเชเชฆเชฐ" เชเชเซเชเซ เชเซ, เชคเซ เชคเชฎเซ เชคเชฎเชพเชฐเซเช เชชเซเชคเชพเชจเซเช เชฒเชเซ เชถเชเซ เชเซ action
.
เชเชจเซเชกเซเชฐเซเชเชก เชเชชเซเชฒเชฟเชเซเชถเชจเซเชธ เช
เชจเซ เชฐเซเชเชเซเชเชจเซเชเซเชต เชฎเชพเชเซ เชธเชฎเชพเชจ เชธเซเช เชฌเชจเชพเชตเชตเชพเชฎเชพเช เชเชตเซเชฏเซ เชนเชคเซ, เชซเชพเชเชฒเซ เชเช เช เชญเชเชกเชพเชฐเชฎเชพเช เชเซ, เชชเชฐเชเชคเซ เชตเชฟเชตเชฟเชง เชถเชพเชเชพเชเชฎเชพเช iOS
, android
ะธ react_native
.
เชเซเชฏเชพเชฐเซ เชฐเซเชฒเซเช เชเซเชฎ เชเซเชเชฒเชพเช เชจเชตเชพ เชชเชเชฒเชพ เชเชฎเซเชฐเชตเชพ เชฎเชพเชเชเซ เชเซ, เชคเซเชฏเชพเชฐเซ เชธเซเชเซเชฐเชฟเชชเซเชเชฎเชพเช เชซเซเชฐเชซเชพเชฐเซ MR เชฆเซเชตเชพเชฐเชพ git เชฎเชพเช เชฐเซเชเซเชฐเซเชก เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ, เชนเชตเซ เชคเซเชเซเชฒเซ เชธเซเชเซเชฐเชฟเชชเซเชเชจเชพ เชเซเชจเซเชเชพเชฐเซเชจเซ เชถเซเชงเชตเชพเชจเซ เชเซเช เชเชฐเซเชฐ เชจเชฅเซ, เช เชจเซ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซเชคเซ, เชนเชตเซ เชคเชฎเชพเชฐเซ เชคเซเชจเซ เชคเซเชกเชตเชพเชจเซ เชชเซเชฐเชฏเชพเชธ เชเชฐเชตเซ เชชเชกเชถเซ.
เชนเชตเซ เชคเซ เชเชพเชคเชฐเซ เชฎเชพเชเซ เชเซ
เช เชเชพเช, เช เชฎเซ เชฌเชงเซ เชธเซเชเซเชฐเชฟเชชเซเชเซเชจเซ เชเชพเชณเชตเชตเชพเชฎเชพเช, เชคเซเชฎเชจเซ เช เชชเชกเซเช เชเชฐเชตเชพเชฎเชพเช เช เชจเซ เช เชชเชกเซเชเซเชธเชจเชพ เชคเชฎเชพเชฎ เชชเชฐเชฟเชฃเชพเชฎเซเชจเซ เช เซเช เชเชฐเชตเชพเชฎเชพเช เชธเชฎเชฏ เชชเชธเชพเชฐ เชเชฐเซเชฏเซ เชนเชคเซ. เชคเซ เชเซเชฌ เช เชจเชฟเชฐเชพเชถเชพเชเชจเช เชนเชคเซเช เชเซเชฏเชพเชฐเซ เชฐเซเชฒเซเชเชฎเชพเช เชญเซเชฒเซ เช เชจเซ เชกเชพเชเชจเชเชพเชเชฎเชจเชพ เชเชพเชฐเชฃเซ เชธเชฐเชณ เชเชพเชเชชเซเชธ เชนเชคเชพ เชเซ เชถเซเชฒ เชธเซเชเซเชฐเชฟเชชเซเชเซเชธเชจเชพ เชเซเชเชเชตเชฃเชฎเชพเช เชเซเชฐเซเช เชฐเชพเชเชตเชพ เชฎเชพเชเซ เชเซเชฌ เชฎเซเชถเซเชเซเชฒ เชนเชคเชพ. เชนเชตเซ เชเชตเซ เชญเซเชฒเซ เชจเซเชฏเซเชจเชคเชฎ เชฅเช เชเช เชเซ. เชซเซเชฐเชซเชพเชฐเซ เชเช เช เชธเชฎเชฏเซ เชคเชฎเชพเชฎ เชเชชเซเชฒเชฟเชเซเชถเชจเซเชฎเชพเช เชฐเซเชฒเชเชเช เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ. เช เชจเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชฎเชพเช เชจเชตเซ เชเชชเซเชฒเชฟเชเซเชถเชจ เชฎเซเชเชตเชพ เชฎเชพเชเซ 15 เชฎเชฟเชจเชฟเช เชฒเชพเชเซ เชเซ - CI เชชเชฐ เชเซเชฎเซเชชเชฒเซเช เชชเชพเชเชชเชฒเชพเชเชจ เชธเซเช เชเชฐเซ เช เชจเซ เชตเชฟเชเชพเชธเชเชฐเซเชคเชพเชจเชพ เชญเชเชกเชพเชฐเชฎเชพเช เชเซ เชเชฎเซเชฐเซ.
เชเชตเซเช เชฒเชพเชเซ เชเซ เชเซ Android เช
เชจเซ เชเชชเซเชฒเชฟเชเซเชถเชจ เชนเชธเซเชคเชพเชเซเชทเชฐ เชฎเชพเชเซ เชซเชพเชธเซเชเชซเชพเชเชฒ เชธเชพเชฅเซเชจเซ เชฎเซเชฆเซเชฆเซ เช
เชธเซเชชเชทเซเช เชฐเชนเซ เชเซ; เชเซ เชฒเซเช เชฐเชธเชชเซเชฐเชฆ เชเซ, เชคเซ เชนเซเช เชเช เชเชพเชฒเซ เชฒเชเซเชถ. เชเชฟเชชเซเชชเชฃเซเชเชฎเชพเช เช
เชฅเชตเชพ เชเซเชฒเชฟเชเซเชฐเชพเชฎ เชชเชฐ "เชคเชฎเซ เช เชธเชฎเชธเซเชฏเชพเชจเซ เชเซเชตเซ เชฐเซเชคเซ เชนเชฒ เชเชฐเชถเซ" เชคเชฎเชพเชฐเชพ เชชเซเชฐเชถเซเชจเซ เช
เชฅเชตเชพ เชธเซเชเชจเซ เชเซเชเชจเซ เชฎเชจเซ เชเชจเชเชฆ เชฅเชถเซ
เชธเซเชฐเซเชธ: www.habr.com