เดฎเตŠเดฌเตˆเตฝ เดธเดฟเดเดธเดฟเดกเดฟ เด…เดจเตเดญเดตเด‚: เดจเดฟเดฐเดตเดงเดฟ เดฎเตŠเดฌเตˆเตฝ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพเด•เตเด•เตเดณเตเดณ เด’เดฐเต เดซเดพเดธเตเดฑเตเดฑเตเดฒเต†เดฏเตเตป เดธเตเดฑเตเดฑเดพเตปเดกเต‡เตผเดกเต

เดฎเตŠเดฌเตˆเตฝ เดธเดฟเดเดธเดฟเดกเดฟ เด…เดจเตเดญเดตเด‚: เดจเดฟเดฐเดตเดงเดฟ เดฎเตŠเดฌเตˆเตฝ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพเด•เตเด•เตเดณเตเดณ เด’เดฐเต เดซเดพเดธเตเดฑเตเดฑเตเดฒเต†เดฏเตเตป เดธเตเดฑเตเดฑเดพเตปเดกเต‡เตผเดกเต
เดซเดพเดธเตเดฑเตเดฑเตโ€Œเดฒเต†เดฏเตเตป เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดฎเตŠเดฌเตˆเตฝ เด†เดชเตเดชเตเด•เตพเด•เตเด•เตเดณเตเดณ เดคเตเดŸเตผเดšเตเดšเดฏเดพเดฏ เดธเด‚เดฏเต‹เดœเดจเดคเตเดคเต†เดฏเตเด‚ เดกเต†เดฒเดฟเดตเดฑเดฟเดฏเต†เดฏเตเด‚ เด•เตเดฑเดฟเดšเตเดšเต เดธเด‚เดธเดพเดฐเดฟเด•เตเด•เดพเตป เดžเดพเตป เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเต. เดŽเดฒเตเดฒเดพ เดฎเตŠเดฌเตˆเตฝ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เดณเดฟเดฒเตเด‚ เดžเด™เตเด™เตพ เดŽเด™เตเด™เดจเต†เดฏเดพเดฃเต CI/CD เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเดคเต, เดžเด™เตเด™เตพ เดŽเด™เตเด™เดจเต† เด…เดตเดฟเดŸเต† เดŽเดคเตเดคเดฟ, เด…เดตเดธเดพเดจเด‚ เดŽเดจเตเดคเดพเดฃเต เดธเด‚เดญเดตเดฟเดšเตเดšเดคเต.

เดŸเต‚เดณเดฟเดฒเต† เดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เดฟเตฝ เด‡เดคเดฟเดจเด•เด‚ เดคเดจเตเดจเต† เดตเต‡เดฃเตเดŸเดคเตเดฐ เดฎเต†เดฑเตเดฑเต€เดฐเดฟเดฏเตฝ เด‰เดฃเตเดŸเต, เด…เดคเต เดžเด™เตเด™เตพเด•เตเด•เต เดคเตเดŸเด•เตเด•เดคเตเดคเดฟเตฝ เดคเดจเตเดจเต† เด‡เดฒเตเดฒเดพเดฏเดฟเดฐเตเดจเตเดจเต, เด…เดคเดฟเดจเดพเตฝ เดžเดพเตป เดฎเดจเดƒเดชเต‚เตผเดตเตเดตเด‚ เด‰เดชเด•เดฐเดฃเดคเตเดคเต† เดตเดฟเดถเดฆเดฎเดพเดฏเดฟ เดตเดฟเดตเดฐเดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ, เดชเด•เตเดทเต‡ เดžเด™เตเด™เตพเด•เตเด•เต เด‰เดฃเตเดŸเดพเดฏเดฟเดฐเตเดจเตเดจเดคเต เดฎเดพเดคเตเดฐเดฎเต‡ เดชเดฐเดพเดฎเตผเดถเดฟเด•เตเด•เต‚:

เดฒเต‡เด–เดจเด‚ เดฐเดฃเตเดŸเต เดญเดพเด—เด™เตเด™เตพ เด‰เตพเด•เตเด•เตŠเดณเตเดณเตเดจเตเดจเต:

  • เด•เดฎเตเดชเดจเดฟเดฏเดฟเตฝ เดฎเตŠเดฌเตˆเตฝ เดธเดฟเด/เดธเดฟเดกเดฟเดฏเตเดŸเต† เด†เดตเดฟเตผเดญเดพเดตเดคเตเดคเดฟเตปเตเดฑเต† เดชเดถเตเดšเดพเดคเตเดคเดฒเด‚
  • N-เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพเด•เตเด•เดพเดฏเดฟ CI/CD เดชเตเดฑเดคเตเดคเดฟเดฑเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดธเดพเด™เตเด•เต‡เดคเดฟเด• เดชเดฐเดฟเดนเดพเดฐเด‚

เด†เดฆเตเดฏเดญเดพเด—เด‚ เดชเดดเดฏ เด•เดพเดฒเดคเตเดคเต† เด•เต‚เดŸเตเดคเตฝ เด—เตƒเดนเดพเดคเตเดฐเดคเตเดตเดฎเดพเดฃเต, เดฐเดฃเตเดŸเดพเดฎเดคเตเดคเต‡เดคเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดธเตเดตเดฏเด‚ เดชเตเดฐเดฏเต‹เด—เดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเดจเตเดจ เด’เดฐเต เด…เดจเตเดญเดตเดฎเดพเดฃเต.

เดšเดฐเดฟเดคเตเดฐเดชเดฐเดฎเดพเดฏเดฟ เดธเด‚เดญเดตเดฟเดšเตเดšเดคเต เด‡เด™เตเด™เดจเต†เดฏเดพเดฃเต

เดตเตผเดทเด‚ 2015

เดžเด™เตเด™เตพ เด‡เดชเตเดชเต‹เตพ เดฎเตŠเดฌเตˆเตฝ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพ เดตเดฟเด•เดธเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป เดคเตเดŸเด™เตเด™เดฟ, เดคเตเดŸเตผเดจเตเดจเต เดคเตเดŸเตผเดšเตเดšเดฏเดพเดฏ เดธเด‚เดฏเต‹เดœเดจเดคเตเดคเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเด‚ DevOps-เดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเด‚ เดฎเดฑเตเดฑเต เดซเดพเดทเดจเดฌเดฟเตพ เด•เดพเดฐเตเดฏเด™เตเด™เดณเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเด‚ เดžเด™เตเด™เตพเด•เตเด•เต เด’เดจเตเดจเตเด‚ เด…เดฑเดฟเดฏเดฟเดฒเตเดฒเดพเดฏเดฟเดฐเตเดจเตเดจเต. เด“เดฐเต‹ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เด…เดชเตโ€Œเดกเต‡เดฑเตเดฑเตเด‚ เดกเดตเดฒเดชเตเดชเตผ เดคเดจเตเดจเต† เดคเตปเตเดฑเต† เดฎเต†เดทเต€เดจเดฟเตฝ เดจเดฟเดจเตเดจเต เดชเตเดฑเดคเตเดคเดฟเดฑเด•เตเด•เดฟ. เด†เตปเดกเตเดฐเต‹เดฏเดฟเดกเดฟเดจเต เด‡เดคเต เดตเดณเดฐเต† เดฒเดณเดฟเดคเดฎเดพเดฃเต†เด™เตเด•เดฟเตฝ - เด’เดคเตเดคเตเดšเต‡เตผเดจเตเดจเต, เด’เดชเตเดชเดฟเดŸเตเดŸเต .apk เดคเตเดŸเตผเดจเตเดจเต เด…เดคเต Google Developer Console-เดฒเต‡เด•เตเด•เต เด…เดชเตโ€Œเดฒเต‹เดกเต เดšเต†เดฏเตโ€Œเดคเต, เดคเตเดŸเตผเดจเตเดจเต 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 เด˜เดŸเตเดŸเด™เตเด™เตพ เดžเด™เตเด™เตพ เดคเดฟเดฐเดฟเดšเตเดšเดฑเดฟเดžเตเดžเต:

  • เดฌเดฟเตฝเดกเต - เดกเดฟเดชเตปเดกเตปเดธเดฟเด•เตพ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเตเด•, เด†เตผเด•เตเด•เตˆเดตเต เด•เต‚เดŸเตเดŸเดฟเดšเตเดšเต‡เตผเด•เตเด•เตเด•,
  • เดŸเต†เดธเตเดฑเตเดฑเต - เดกเดตเดฒเดชเตเดชเตผ เดฏเต‚เดฃเดฟเดฑเตเดฑเต เดŸเต†เดธเตเดฑเตเดฑเตเด•เตพ เดจเดŸเดคเตเดคเตเดจเตเดจเต, เด•เดตเดฑเต‡เดœเต เด•เดฃเด•เตเด•เดพเด•เตเด•เตเดจเตเดจเต,
  • เดธเต‹เดฃเดพเตผ - เดŽเดฒเตเดฒเดพ เดฒเดฟเตปเตเดฑเดฑเตเด•เดณเตเด‚ เดฒเต‹เดžเตเดšเต เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดธเต‹เดจเดพเตผ เด•เตเดฏเต‚เดฌเดฟเดจเต เดฑเดฟเดชเตเดชเต‹เตผเดŸเตเดŸเตเด•เตพ เด…เดฏเดฏเตเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต,
  • เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเด• - เด†เตฝเดซเดฏเดฟเดฒเต‡เด•เตเด•เต เด’เดฐเต เดชเตเดฐเดพเดตเดธเตเดคเต เด…เดฏเด•เตเด•เตเดจเตเดจเต (เดŸเต†เดธเตเดฑเตเดฑเตเดซเตเดฒเตˆเดฑเตเดฑเต).

เดจเดฟเด™เตเด™เตพ เดตเดฟเดถเดฆเดพเด‚เดถเด™เตเด™เดณเดฟเดฒเต‡เด•เตเด•เต เดชเต‹เด•เตเดจเตเดจเดฟเดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เดณเดฟเตฝ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจ เด•เต€เด•เตพ เด’เดดเดฟเดตเดพเด•เตเด•เดฟเดฏเดพเตฝ, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดˆ Fastfile เดฒเดญเดฟเด•เตเด•เตเด‚:

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

เดฎเตเด•เดณเดฟเดฒเตเดณเตเดณ เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเตฝ, เดจเดฎเตเด•เตเด•เต เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เต‡เดฃเตเดŸ เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเดฑเตเด•เดณเตเดŸเต† เด’เดฐเต เดญเดพเด—เด‚ เดฎเดพเดคเตเดฐเด‚: เด‡เดตเดฏเดพเดฃเต เดฌเดฟเตฝเดกเต เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเดฑเตเด•เตพ - เดธเตเด•เต€เดฎ, เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป, เดชเตเดฐเตŠเดตเดฟเดทเตป เดชเตเดฐเตŠเดซเตˆเตฝ เดชเต‡เดฐเตเด•เตพ, เด…เดคเตเดชเต‹เดฒเต† เดคเดจเตเดจเต† เดตเดฟเดคเดฐเดฃ เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเดฑเตเด•เตพ - เดกเต†เดตเดฒเดชเตเดชเตผ เด…เด•เตเด•เต—เดฃเตเดŸเดฟเตปเตเดฑเต† เด†เดชเตเดชเดฟเตพ เดเดกเดฟ, เดชเดพเดธเตโ€Œเดตเต‡เดกเต, เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดเดกเดฟ เดฎเตเดคเดฒเดพเดฏเดต เด“เตบ. เด†เดฆเตเดฏ เดเด•เดฆเต‡เดถ เด•เดฃเด•เตเด•เต เดŽเดจเตเดจ เดจเดฟเดฒเดฏเดฟเตฝ, เดžเด™เตเด™เตพ เดˆ เด•เต€เด•เดณเต†เดฒเตเดฒเดพเด‚ เดชเตเดฐเดคเตเดฏเต‡เด• เดซเดฏเดฒเตเด•เดณเดฟเตฝ เด‡เดŸเตเดจเตเดจเต - Gymfile, Matchfile ะธ Appfile.

เด‡เดชเตเดชเต‹เตพ เดœเต†เด™เตเด•เดฟเตปเดธเดฟเตฝ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด•เดพเดดเตเดš เดฎเด™เตเด™เดฟเด•เตเด•เดพเดคเตเดคเดคเตเด‚ เด•เดฃเตเดฃเตเด•เตพเด•เตเด•เต เดŽเดณเตเดชเตเดชเดคเตเดคเดฟเตฝ เดตเดพเดฏเดฟเด•เตเด•เดพเดตเตเดจเตเดจเดคเตเดฎเดพเดฏ เดนเตเดฐเดธเตเดต เด•เดฎเดพเตปเดกเตเด•เตพ เดตเดฟเดณเดฟเด•เตเด•เดพเด‚:

# fastlane ios <lane_name>

$ fastlane ios build
$ fastlane ios test
$ fastlane ios run_sonar
$ fastlane ios deploy

เดนเตเดฑเต‡, เดžเด™เตเด™เตพ เดฎเดฟเด•เดšเตเดšเดตเดฐเดพเดฃเต

เดจเดฟเดจเด•เตเด•เต†เดจเตเดคเต เด•เดฟเดŸเตเดŸเดฟ? เด“เดฐเต‹ เด˜เดŸเตเดŸเดคเตเดคเดฟเดจเตเด‚ เด•เดฎเดพเตปเดกเตเด•เตพ เดฎเดพเดฏเตโ€Œเด•เตเด•เตเด•. เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตเด•เตพ เดตเตƒเดคเตเดคเดฟเดฏเดพเด•เตเด•เดฟ, เดซเดพเดธเตเดฑเตเดฑเตเดฒเต†เดฏเตเตป เดซเดฏเดฒเตเด•เดณเดฟเตฝ เดญเด‚เด—เดฟเดฏเดพเดฏเดฟ เด•เตเดฐเดฎเต€เด•เดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต. เดธเดจเตเดคเต‹เดทเดคเตเดคเต‹เดŸเต†, เดžเด™เตเด™เตพ เดกเต†เดตเดฒเดชเตเดชเตผเดฎเดพเดฐเตเดŸเต† เด…เดŸเตเดคเตเดคเต‡เด•เตเด•เต เด“เดŸเดฟ, เด…เดตเตผเด•เตเด•เต เด†เดตเดถเตเดฏเดฎเตเดณเตเดณเดคเต†เดฒเตเดฒเดพเด‚ เด…เดตเดฐเตเดŸเต† เดถเต‡เด–เดฐเดฃเด™เตเด™เดณเดฟเดฒเต‡เด•เตเด•เต เดšเต‡เตผเด•เตเด•เดพเตป เด†เดตเดถเตเดฏเดชเตเดชเต†เดŸเตเดŸเต.

เดŽเดจเตเดจเดพเตฝ เดžเด™เตเด™เตพเด•เตเด•เตเด‚ เด‡เดคเต‡ เดฌเตเดฆเตเดงเดฟเดฎเตเดŸเตเดŸเตเด•เตพ เดจเต‡เดฐเดฟเดŸเต‡เดฃเตเดŸเดฟเดตเดฐเตเดฎเต†เดจเตเดจเต เด•เดพเดฒเด•เตเดฐเดฎเต‡เดฃ เดžเด™เตเด™เตพ เดฎเดจเดธเตเดธเดฟเดฒเดพเด•เตเด•เดฟ - เด’เดฐเต เดคเดฐเดคเตเดคเดฟเตฝ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดฎเดฑเตเดฑเตŠเดฐเต เดตเดฟเดงเดคเตเดคเดฟเตฝ เดธเตเดตเดจเตเดคเด‚ เดœเต€เดตเดฟเดคเด‚ เดจเดฏเดฟเด•เตเด•เดพเตป เดคเตเดŸเด™เตเด™เตเดจเตเดจ 20 เด…เดธเด‚เดฌเตเดฒเดฟ เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตเด•เตพ เดžเด™เตเด™เดณเตเดŸเต† เดชเด•เตเด•เดฒเตเดฃเตเดŸเดพเด•เตเด‚, เด…เดต เดŽเดกเดฟเดฑเตเดฑเตเดšเต†เดฏเตเดฏเตเดจเตเดจเดคเต เด•เต‚เดŸเตเดคเตฝ เดฌเตเดฆเตเดงเดฟเดฎเตเดŸเตเดŸเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเด‚, เด•เดพเดฐเดฃเด‚ เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตเด•เตพ เดถเต‡เด–เดฐเดฃเด™เตเด™เดณเดฟเดฒเต‡เด•เตเด•เต เดจเต€เด™เตเด™เตเด‚. เดžเด™เตเด™เตพเด•เตเด•เต เด…เดตเดฟเดŸเต† เดชเตเดฐเดตเต‡เดถเดจเดฎเตเดฃเตเดŸเดพเดฏเดฟเดฐเตเดจเตเดจเดฟเดฒเตเดฒ. เด•เต‚เดŸเดพเดคเต†, เดชเตŠเดคเตเดตเต‡, เดจเดฎเตเดฎเตเดŸเต† เดตเต‡เดฆเดจ เดˆ เดฐเต€เดคเดฟเดฏเดฟเตฝ เดชเดฐเดฟเดนเดฐเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเดฟเดฒเตเดฒ.

เดฎเตŠเดฌเตˆเตฝ เดธเดฟเดเดธเดฟเดกเดฟ เด…เดจเตเดญเดตเด‚: เดจเดฟเดฐเดตเดงเดฟ เดฎเตŠเดฌเตˆเตฝ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพเด•เตเด•เตเดณเตเดณ เด’เดฐเต เดซเดพเดธเตเดฑเตเดฑเตเดฒเต†เดฏเตเตป เดธเตเดฑเตเดฑเดพเตปเดกเต‡เตผเดกเต

เดŸเดพเดธเตเด•เต #2: N เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพเด•เตเด•เดพเดฏเดฟ เด’เดฐเตŠเดฑเตเดฑ Fastfile เดจเต‡เดŸเตเด•

เดชเตเดฐเดถเตเดจเด‚ เดชเดฐเดฟเดนเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต เด…เดคเตเดฐ เดฌเตเดฆเตเดงเดฟเดฎเตเดŸเตเดŸเตเดณเตเดณ เด•เดพเดฐเตเดฏเดฎเดฒเตเดฒเต†เดจเตเดจเต เด‡เดชเตเดชเต‹เตพ เดคเต‹เดจเตเดจเตเดจเตเดจเต - เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเตเด•เตพ เดธเดœเตเดœเดฎเดพเด•เตเด•เตเด•, เดจเดฎเตเด•เตเด•เต เดชเต‹เด•เดพเด‚. เด…เดคเต†, เดตเดพเดธเตเดคเดตเดคเตเดคเดฟเตฝ, เด…เด™เตเด™เดจเต†เดฏเดพเดฃเต เดชเตเดฐเดถเตเดจเด‚ เดชเดฐเดฟเดนเดฐเดฟเดšเตเดšเดคเต. เดŽเดจเตเดจเดพเตฝ เดžเด™เตเด™เตพ เด…เดคเต เดธเตเด•เตเดฐเต‚ เดšเต†เดฏเตเดค เดจเดฟเดฎเดฟเดทเดคเตเดคเดฟเตฝ, เดซเดพเดธเตเดฑเตเดฑเตเดฒเต†เดฏเดฟเดจเดฟเตฝ เดคเดจเตเดจเต†เดฏเต‹, เดซเดพเดธเตเดฑเตเดฑเตเดฒเต†เดฏเตเตป เดŽเดดเตเดคเดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เดฑเต‚เดฌเดฟเดฏเดฟเดฒเต‹, เดจเต†เดฑเตเดฑเตเดตเตผเด•เตเด•เดฟเดฒเต† เด‰เดชเดฏเต‹เด—เดชเตเดฐเดฆเดฎเดพเดฏ เด‰เดฆเดพเดนเดฐเดฃเด™เตเด™เดณเต‹ เดžเด™เตเด™เตพเด•เตเด•เต เด‰เดฃเตเดŸเดพเดฏเดฟเดฐเตเดจเตเดจเดฟเดฒเตเดฒ - เดซเดพเดธเตเดฑเตเดฑเตเดฒเต†เดฏเดฟเดจเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เด…เดจเตเดจเต เดŽเดดเตเดคเดฟเดฏ เดŽเดฒเตเดฒเดพเดตเดฐเตเด‚ เด’เดฐเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตปเตเดฑเต† เด‰เดฆเดพเดนเดฐเดฃเดฎเดพเดฏเดฟ เดชเดฐเดฟเดฎเดฟเดคเดชเตเดชเต†เดŸเตเดคเตเดคเดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต. เด’เดฐเต เดกเต†เดตเดฒเดชเตเดชเตผ.

Fastlane-เดจเต เดชเดฐเดฟเดธเตเดฅเดฟเดคเดฟ เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเตเด•เตพ เด•เตˆเด•เดพเดฐเตเดฏเด‚ เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเด‚, เด•เต€เดšเต†เดฏเดฟเตป เดชเดพเดธเตโ€Œเดตเต‡เดกเต เดธเดœเตเดœเต€เด•เดฐเดฟเดšเตเดšเตเด•เตŠเดฃเตเดŸเต เดžเด™เตเด™เตพ เด‡เดคเต เด‡เดคเดฟเดจเด•เด‚ เดชเดฐเต€เด•เตเดทเดฟเดšเตเดšเต:

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

เด‡เดชเตเดชเต‹เตพ, เดซเดพเดธเตเดฑเตเดฑเตโ€Œเดฒเต†เดฏเตเตป เดซเดฏเดฒเตเด•เดณเดฟเตฝ เดˆ เด•เต€เด•เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเตป เดคเตเดŸเด™เตเด™เตเดจเตเดจเดคเดฟเดจเต, เด…เดต เดŽเด™เตเด™เดจเต† เด…เดตเดฟเดŸเต† เดกเต†เดฒเดฟเดตเตผ เดšเต†เดฏเตเดฏเดฃเดฎเต†เดจเตเดจเต เดžเด™เตเด™เตพ เด•เดฃเตเดŸเต†เดคเตเดคเต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต. Fastlane-เดจเต เด‡เดคเดฟเดจเต เด’เดฐเต เดชเดฐเดฟเดนเดพเดฐเดฎเตเดฃเตเดŸเต: dotenv เดตเดดเดฟ เดตเต‡เดฐเดฟเดฏเดฌเดฟเดณเตเด•เตพ เดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เดตเตเดฏเดคเตเดฏเดธเตโ€Œเดค เด†เดตเดถเตเดฏเด™เตเด™เตพเด•เตเด•เดพเดฏเดฟ เด•เต€เด•เตพ เดฒเต‹เดกเตเดšเต†เดฏเตเดฏเตเดจเตเดจเดคเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดชเตเดฐเดงเดพเดจเดฎเดพเดฃเต†เด™เตเด•เดฟเตฝ, เดซเดพเดธเตเดฑเตเดฑเตโ€Œเดฒเตˆเตป เดกเดฏเดฑเด•เตโ€ŒเดŸเดฑเดฟเดฏเดฟเตฝ เดจเดฟเดฐเดตเดงเดฟ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดซเดฏเดฒเตเด•เตพ เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เตเด• เดŽเดจเตเดจเต เดกเต‹เด•เตเดฏเตเดฎเต†เตปเตเดฑเต‡เดทเตป เดชเดฑเดฏเตเดจเตเดจเต. .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

Fastfile เดตเดดเดฟ เดกเต—เตบเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต Fastlane-เดจเต เด’เดฐเต เดชเดฐเดฟเดนเดพเดฐเด‚ เด‰เดฃเตเดŸเต†เด™เตเด•เดฟเดฒเตเด‚, เด‡เดชเตเดชเต‹เตพ เดˆ เดชเดฐเดฟเดนเดพเดฐเด‚ เด‰เดชเต‡เด•เตเดทเดฟเดšเตเดšเต เดจเดŸเดชเดŸเดฟ import_from_git, เดŽเดจเตเดจเดพเตฝ เด‡เดคเต Fastfile-เดจเต เดฎเดพเดคเตเดฐเดฎเต‡ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เต‚, เดŽเดจเตเดจเดพเตฝ เดฎเดฑเตเดฑเต เดซเดฏเดฒเตเด•เตพเด•เตเด•เต เดตเต‡เดฃเตเดŸเดฟเดฏเดฒเตเดฒ. เดจเดฟเด™เตเด™เตพเด•เตเด•เต "เดถเดฐเดฟเด•เตเด•เตเด‚ เดฎเดจเต‹เดนเดฐเด‚" เดตเต‡เดฃเดฎเต†เด™เตเด•เดฟเตฝ, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดธเตเดตเดจเตเดคเดฎเดพเดฏเดฟ เดŽเดดเตเดคเดพเด‚ action.

Android เด…เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพเด•เตเด•เตเด‚ ReactNative-เดจเตเด‚ เดธเดฎเดพเดจเดฎเดพเดฏ เด’เดฐเต เดธเต†เดฑเตเดฑเต เดจเดฟเตผเดฎเตเดฎเดฟเดšเตเดšเต, เดซเดฏเดฒเตเด•เตพ เด’เดฐเต‡ เดถเต‡เด–เดฐเดคเตเดคเดฟเดฒเดพเดฃเต, เดชเด•เตเดทเต‡ เดตเตเดฏเดคเตเดฏเดธเตเดค เดถเดพเด–เด•เดณเดฟเดฒเดพเดฃเต iOS, android ะธ react_native.

เดฑเดฟเดฒเต€เดธเต เดŸเต€เด‚ เดšเดฟเดฒ เดชเตเดคเดฟเดฏ เด˜เดŸเตเดŸเด™เตเด™เตพ เดšเต‡เตผเด•เตเด•เดพเตป เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ, เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเดฟเดฒเต† เดฎเดพเดฑเตเดฑเด™เตเด™เตพ Git-เตฝ MR เดตเดดเดฟ เดฐเต‡เด–เดชเตเดชเต†เดŸเตเดคเตเดคเตเดจเตเดจเต, เดคเด•เตผเดจเตเดจ เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตเด•เดณเตเดŸเต† เด•เตเดฑเตเดฑเดตเดพเดณเดฟเด•เดณเต† เด‡เดจเดฟ เด…เดจเตเดตเต‡เดทเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเดฟเดฒเตเดฒ, เดชเตŠเดคเตเดตเต‡, เด‡เดชเตเดชเต‹เตพ เดจเดฟเด™เตเด™เตพ เด…เดคเต เดคเด•เตผเด•เตเด•เดพเตป เดถเตเดฐเดฎเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต.

เด‡เดชเตเดชเต‹เตพ เด…เดคเต เด‰เดฑเดชเตเดชเดพเดฃเต

เดฎเตเดฎเตเดชเต, เดŽเดฒเตเดฒเดพ เดธเตโ€Œเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตเด•เดณเตเด‚ เดชเดฐเดฟเดชเดพเดฒเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เด…เดต เด…เดชเตโ€Œเดกเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเด‚ เด…เดชเตโ€Œเดกเต‡เดฑเตเดฑเตเด•เดณเตเดŸเต† เดŽเดฒเตเดฒเดพ เด…เดจเดจเตเดคเดฐเดซเดฒเด™เตเด™เดณเตเด‚ เดชเดฐเดฟเดนเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เดžเด™เตเด™เตพ เดธเดฎเดฏเด‚ เดšเต†เดฒเดตเดดเดฟเดšเตเดšเต. เดฑเดฟเดฒเต€เดธเตเด•เดณเดฟเดฒเต† เดชเดฟเดถเด•เตเด•เดณเตเดŸเต†เดฏเตเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดจเดฐเดนเดฟเดคเดฎเดพเดฏ เดธเดฎเดฏเดคเตเดคเดฟเตปเตเดฑเต†เดฏเตเด‚ เด•เดพเดฐเดฃเด™เตเด™เตพ เดทเต†เตฝ เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตเด•เดณเตเดŸเต† เดคเดฟเดฐเด•เตเด•เดฟเตฝ เดŸเตเดฐเดพเด•เตเด•เต เดšเต†เดฏเตเดฏเดพเตป เดตเดณเดฐเต† เดฌเตเดฆเตเดงเดฟเดฎเตเดŸเตเดŸเตเดณเตเดณ เดฒเดณเดฟเดคเดฎเดพเดฏ เด…เด•เตเดทเดฐเดคเตเดคเต†เดฑเตเดฑเตเด•เตพ เด†เดฏเดฟเดฐเตเดจเตเดจเดชเตเดชเต‹เตพ เด‡เดคเต เดตเดณเดฐเต† เดจเดฟเดฐเดพเดถเดพเดœเดจเด•เดฎเดพเดฏเดฟเดฐเตเดจเตเดจเต. เด‡เดชเตเดชเต‹เตพ เด…เดคเตเดคเดฐเด‚ เดชเดฟเดถเด•เตเด•เตพ เด•เตเดฑเดžเตเดžเดคเต เด†เดฏเดฟ เด•เตเดฑเดžเตเดžเต. เดŽเดฒเตเดฒเดพ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เดณเดฟเดฒเต‡เด•เตเด•เตเด‚ เด’เดฐเต‡เดธเดฎเดฏเด‚ เดฎเดพเดฑเตเดฑเด™เตเด™เตพ เด•เตŠเดฃเตเดŸเตเดตเดฐเตเดจเตเดจเต. เด’เดฐเต เดชเตเดคเดฟเดฏ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดชเตเดฐเต‹เดธเดธเต เดšเต†เดฏเตเดฏเดพเตป 15 เดฎเดฟเดจเดฟเดฑเตเดฑเต เดŽเดŸเตเด•เตเด•เตเด‚ - CI-เดฏเดฟเตฝ เด’เดฐเต เดŸเต†เด‚เดชเตเดฒเต‡เดฑเตเดฑเต เดชเตˆเดชเตเดชเตเดฒเตˆเตป เดธเดœเตเดœเต€เด•เดฐเดฟเดšเตเดšเต เดกเดตเดฒเดชเตเดชเดฑเตเดŸเต† เดถเต‡เด–เดฐเดคเตเดคเดฟเดฒเต‡เด•เตเด•เต เด•เต€เด•เตพ เดšเต‡เตผเด•เตเด•เตเด•.

เด†เตปเดกเตเดฐเต‹เดฏเดฟเดกเดฟเดจเตเดณเตเดณ Fastfile เด‰เด‚ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดธเดฟเด—เตเดจเต‡เดšเตเดšเดฑเตเด‚ เด‰เดณเตเดณ เดชเต‹เดฏเดฟเตปเตเดฑเต เดตเดฟเดถเดฆเต€เด•เดฐเดฟเด•เตเด•เดพเดจเดพเด•เดพเดคเตเดคเดคเดพเดฏเดฟ เดคเต‹เดจเตเดจเตเดจเตเดจเต, เดฒเต‡เด–เดจเด‚ เดฐเดธเด•เดฐเดฎเดพเดฃเต†เด™เตเด•เดฟเตฝ, เดžเดพเตป เด’เดฐเต เดคเตเดŸเตผเดšเตเดš เดŽเดดเตเดคเตเด‚. เด…เดญเดฟเดชเตเดฐเดพเดฏเด™เตเด™เดณเดฟเดฒเต‹ เดŸเต†เดฒเดฟเด—เตเดฐเดพเดฎเดฟเดฒเต‹ "เดˆ เดชเตเดฐเดถเตเดจเด‚ เดŽเด™เตเด™เดจเต† เดชเดฐเดฟเดนเดฐเดฟเด•เตเด•เตเด‚" เดŽเดจเตเดจ เดจเดฟเด™เตเด™เดณเตเดŸเต† เดšเต‹เดฆเตเดฏเด™เตเด™เดณเต‹ เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เดณเต‹ เด•เดพเดฃเตเดจเตเดจเดคเดฟเตฝ เดŽเดจเดฟเด•เตเด•เต เดธเดจเตเดคเต‹เดทเดฎเตเดฃเตเดŸเต. เดฌเดทเตเด•เดฟเดฑเต‹เดต.

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•