เชฎเซ‹เชฌเชพเช‡เชฒ CICD เช…เชจเซเชญเชต: เช˜เชฃเซ€ เชฎเซ‹เชฌเชพเช‡เชฒ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซเชธ เชฎเชพเชŸเซ‡ เชเช• เชซเชพเชธเซเชŸเชฒเซ‡เชจ เชธเซเชŸเชพเชจเซเชกเชฐเซเชก

เชฎเซ‹เชฌเชพเช‡เชฒ CICD เช…เชจเซเชญเชต: เช˜เชฃเซ€ เชฎเซ‹เชฌเชพเช‡เชฒ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซเชธ เชฎเชพเชŸเซ‡ เชเช• เชซเชพเชธเซเชŸเชฒเซ‡เชจ เชธเซเชŸเชพเชจเซเชกเชฐเซเชก
เชนเซเช‚ เชซเชพเชธเซเชŸเชฒเซ‡เชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชฎเซ‹เชฌเชพเช‡เชฒ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซเชธ เชฎเชพเชŸเซ‡ เชธเชคเชค เชเช•เซ€เช•เชฐเชฃ เช…เชจเซ‡ เชตเชฟเชคเชฐเชฃ เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเชตเชพ เชฎเชพเช‚เช—เซ เช›เซเช‚. เช…เชฎเซ‡ เชคเชฎเชพเชฎ เชฎเซ‹เชฌเชพเช‡เชฒ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซเชธ เชชเชฐ CI/CD เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฒเชพเช—เซ เช•เชฐเซ€เช เช›เซ€เช, เช…เชฎเซ‡ เชคเซเชฏเชพเช‚ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชชเชนเซ‹เช‚เชšเซเชฏเชพ เช…เชจเซ‡ เช…เช‚เชคเซ‡ เชถเซเช‚ เชฅเชฏเซเช‚.

เชŸเซ‚เชฒ เชชเชฐเชจเชพ เชจเซ‡เชŸเชตเชฐเซเช• เชชเชฐ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชชเซ‚เชฐเชคเซ€ เชธเชพเชฎเช—เซเชฐเซ€ เช›เซ‡, เชœเซ‡เชจเซ‹ เช…เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชถเชฐเซ‚เช†เชคเชฎเชพเช‚ เช…เชญเชพเชต เชนเชคเซ‹, เชคเซ‡เชฅเซ€ เชนเซเช‚ เช‡เชฐเชพเชฆเชพเชชเซ‚เชฐเซเชตเช• เชŸเซ‚เชฒเชจเซเช‚ เชตเชฟเช—เชคเชตเชพเชฐ เชตเชฐเซเชฃเชจ เช•เชฐเซ€เชถ เชจเชนเซ€เช‚, เชชเชฐเช‚เชคเซ เชคเซ‡ เชธเชฎเชฏเซ‡ เช…เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชœเซ‡ เชนเชคเซเช‚ เชคเซ‡เชจเซ‹ เชœ เชธเช‚เชฆเชฐเซเชญ เช†เชชเซ€เชถ:

เชฒเซ‡เช–เชฎเชพเช‚ เชฌเซ‡ เชญเชพเช—เซ‹ เช›เซ‡:

  • เช•เช‚เชชเชจเซ€เชฎเชพเช‚ เชฎเซ‹เชฌเชพเชˆเชฒ เชธเซ€เช†เชˆ/เชธเซ€เชกเซ€เชจเชพ เช‰เชฆเชญเชตเชจเซ€ เชชเซƒเชทเซเช เชญเซ‚เชฎเชฟ
  • เชเชจ-เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชฎเชพเชŸเซ‡ 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 เชเชธเซ‡เชฎเซเชฌเชฒเซ€ เชธเซเช•เซเชฐเชฟเชชเซเชŸเซ‹ เชนเชถเซ‡ เชœเซ‡ เชเช• เชฐเซ€เชคเซ‡ เช…เชฅเชตเชพ เชฌเซ€เชœเซ€ เชฐเซ€เชคเซ‡ เชชเซ‹เชคเชพเชจเซเช‚ เชœเซ€เชตเชจ เชœเซ€เชตเชตเชพเชจเซเช‚ เชถเชฐเซ‚ เช•เชฐเชถเซ‡, เชคเซ‡เชฎเชจเซ‡ เชธเช‚เชชเชพเชฆเชฟเชค เช•เชฐเชตเซเช‚ เชตเชงเซ เชฎเซเชถเซเช•เซ‡เชฒ เชนเชถเซ‡, เช•เชพเชฐเชฃ เช•เซ‡ เชธเซเช•เซเชฐเชฟเชชเซเชŸเซ‹ เชญเช‚เชกเชพเชฐเชฎเชพเช‚ เชœเชถเซ‡, เช…เชจเซ‡ เช…เชฎเชจเซ‡ เชคเซเชฏเชพเช‚ เชชเซเชฐเชตเซ‡เชถ เชจเชนเซ‹เชคเซ‹. เช…เชจเซ‡, เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡, เช† เชฐเซ€เชคเซ‡ เช†เชชเชฃเซ€ เชชเซ€เชกเชพเชจเซ‡ เชนเชฒ เช•เชฐเชตเซ€ เชถเช•เซเชฏ เชฌเชจเชถเซ‡ เชจเชนเซ€เช‚.

เชฎเซ‹เชฌเชพเช‡เชฒ CICD เช…เชจเซเชญเชต: เช˜เชฃเซ€ เชฎเซ‹เชฌเชพเช‡เชฒ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซเชธ เชฎเชพเชŸเซ‡ เชเช• เชซเชพเชธเซเชŸเชฒเซ‡เชจ เชธเซเชŸเชพเชจเซเชกเชฐเซเชก

เช•เชพเชฐเซเชฏ #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

เชนเชตเซ‡, เชซเชพเชธเซเชŸเชฒเซ‡เชจ เชซเชพเชˆเชฒเซ‹เชฎเชพเช‚ เช† เช•เซ€เช“เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชถเชฐเซ‚ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เช…เชฎเชพเชฐเซ‡ เชคเซ‡เชฎเชจเซ‡ เชคเซเชฏเชพเช‚ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชชเชนเซ‹เช‚เชšเชพเชกเชตเชพ เชคเซ‡ เชถเซ‹เชงเชตเชพเชจเซเช‚ เชนเชคเซเช‚. เชซเชพเชธเซเชŸเชฒเซ‡เชจ เชชเชพเชธเซ‡ เช†เชจเซ‹ เช‰เช•เซ‡เชฒ เช›เซ‡: dotenv เชฆเซเชตเชพเชฐเชพ เชšเชฒเซ‹ เชฒเซ‹เชก เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡. เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เชฐเชฃ เช•เชนเซ‡ เช›เซ‡ เช•เซ‡ เชœเซ‹ เชคเชฎเชพเชฐเชพ เชฎเชพเชŸเซ‡ เชตเชฟเชตเชฟเชง เชนเซ‡เชคเซเช“ เชฎเชพเชŸเซ‡ เช•เซ€ เชฒเซ‹เชก เช•เชฐเชตเซ€ เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ เช›เซ‡, เชคเซ‹ เชซเชพเชธเซเชŸเชฒเซ‡เชจ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เชฎเชพเช‚ เช˜เชฃเซ€ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชซเชพเช‡เชฒเซ‹ เชฌเชจเชพเชตเซ‹. .env, .env.default, .env.development.

เช…เชจเซ‡ เชชเช›เซ€ เช…เชฎเซ‡ เช† เชชเซเชธเซเชคเช•เชพเชฒเชฏเชจเซ‹ เช‰เชชเชฏเซ‹เช— เชฅเซ‹เชกเซ‹ เช…เชฒเช— เชฐเซ€เชคเซ‡ เช•เชฐเชตเชพเชจเซเช‚ เชจเช•เซเช•เซ€ เช•เชฐเซเชฏเซเช‚. เชšเชพเชฒเซ‹ เชกเซ‡เชตเชฒเชชเชฐเซเชธเชจเซ€ เชฐเชฟเชชเซ‹เชเซ€เชŸเชฐเซ€เชฎเชพเช‚ เชซเชพเชธเซเชŸเชฒเซ‡เชจ เชธเซเช•เซเชฐเชฟเชชเซเชŸเซเชธ เช…เชจเซ‡ เชคเซ‡เชจเซ€ เชฎเซ‡เชŸเชพ เชฎเชพเชนเชฟเชคเซ€เชจเซ‡ เชจเชนเซ€เช‚, เชชเชฐเช‚เชคเซ เชซเชพเช‡เชฒเชฎเชพเช‚ เช† เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซ€ เช…เชจเชจเซเชฏ เชšเชพเชตเซ€เช“ เชฎเซ‚เช•เซ€เช. .env.appName.

เชชเซ‹เชคเชพเชจเซ‡ Fastfile, Appfile, Matchfile ะธ Gymfile, เช…เชฎเซ‡ เชคเซ‡เชจเซ‡ เช…เชฒเช— เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€เชฎเชพเช‚ เช›เซเชชเชพเชตเซ€ เชฆเซ€เชงเซเช‚ เช›เซ‡. เช…เชจเซเชฏ เชธเซ‡เชตเชพเช“เชฎเชพเช‚เชฅเซ€ เชชเชพเชธเชตเชฐเซเชก เช•เซ€ เชธเชพเชฅเซ‡เชจเซ€ เชตเชงเชพเชฐเชพเชจเซ€ เชซเชพเช‡เชฒ เชคเซเชฏเชพเช‚ เช›เซเชชเชพเชฏเซ‡เชฒเซ€ เชนเชคเซ€ - .env.
เชคเชฎเซ‡ เชเช• เช‰เชฆเชพเชนเชฐเชฃ เชœเซ‹เชˆ เชถเช•เซ‹ เช›เซ‹ เช…เชนเซ€เช‚.

เชฎเซ‹เชฌเชพเช‡เชฒ CICD เช…เชจเซเชญเชต: เช˜เชฃเซ€ เชฎเซ‹เชฌเชพเช‡เชฒ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซเชธ เชฎเชพเชŸเซ‡ เชเช• เชซเชพเชธเซเชŸเชฒเซ‡เชจ เชธเซเชŸเชพเชจเซเชกเชฐเซเชก

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

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹