เจฎเฉ‹เจฌเจพเจˆเจฒ CICD เจ…เจจเฉเจญเจต: เจ•เจˆ เจฎเฉ‹เจฌเจพเจˆเจฒ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจฒเจˆ เจ‡เฉฑเจ• เจซเจพเจธเจŸเจฒเฉ‡เจจ เจธเจŸเฉˆเจ‚เจกเจฐเจก

เจฎเฉ‹เจฌเจพเจˆเจฒ CICD เจ…เจจเฉเจญเจต: เจ•เจˆ เจฎเฉ‹เจฌเจพเจˆเจฒ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจฒเจˆ เจ‡เฉฑเจ• เจซเจพเจธเจŸเจฒเฉ‡เจจ เจธเจŸเฉˆเจ‚เจกเจฐเจก
เจฎเฉˆเจ‚ เจซเจพเจธเจŸเจฒเฉ‡เจจ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจฎเฉ‹เจฌเจพเจˆเจฒ เจเจชเจธ เจฒเจˆ เจจเจฟเจฐเฉฐเจคเจฐ เจเจ•เฉ€เจ•เจฐเจฃ เจ…เจคเฉ‡ เจกเจฟเจฒเฉ€เจตเจฐเฉ€ เจฌเจพเจฐเฉ‡ เจ—เฉฑเจฒ เจ•เจฐเจจเจพ เจšเจพเจนเจพเจ‚เจ—เจพเฅค เจ…เจธเฉ€เจ‚ เจธเจพเจฐเฉ€เจ†เจ‚ เจฎเฉ‹เจฌเจพเจˆเจฒ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ 'เจคเฉ‡ CI/CD เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจฒเจพเจ—เฉ‚ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚, เจ…เจธเฉ€เจ‚ เจ‰เฉฑเจฅเฉ‡ เจ•เจฟเจตเฉ‡เจ‚ เจชเจนเฉเฉฐเจšเฉ‡ เจ…เจคเฉ‡ เจ…เฉฐเจค เจตเจฟเฉฑเจš เจ•เฉ€ เจนเฉ‹เจ‡เจ†เฅค

เจŸเฉ‚เจฒ 'เจคเฉ‡ เจจเฉˆเจŸเจตเจฐเจ• 'เจคเฉ‡ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจ•เจพเจซเจผเฉ€ เจธเจฎเฉฑเจ—เจฐเฉ€ เจนเฉˆ, เจœเจฟเจธเจฆเฉ€ เจธเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจธเจผเฉเจฐเฉ‚เจ†เจค เจตเจฟเฉฑเจš เจฌเจนเฉเจค เจ˜เจพเจŸ เจธเฉ€, เจ‡เจธ เจฒเจˆ เจฎเฉˆเจ‚ เจœเจพเจฃเจฌเฉเฉฑเจ เจ•เฉ‡ เจŸเฉ‚เจฒ เจฆเจพ เจตเจฟเจธเจฅเจพเจฐ เจตเจฟเฉฑเจš เจตเจฐเจฃเจจ เจจเจนเฉ€เจ‚ เจ•เจฐเจพเจ‚เจ—เจพ, เจชเจฐ เจธเจฟเจฐเจซ เจ‰เจธ เจฆเจพ เจนเจตเจพเจฒเจพ เจฆเฉ‡เจตเจพเจ‚เจ—เจพ เจœเฉ‹ เจธเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจธเฉ€:

เจฒเฉ‡เจ– เจฆเฉ‡ เจฆเฉ‹ เจญเจพเจ— เจนเจจ:

  • เจ•เฉฐเจชเจจเฉ€ เจตเจฟเฉฑเจš เจฎเฉ‹เจฌเจพเจˆเจฒ CI/CD เจฆเฉ‡ เจ‰เจญเจพเจฐ เจฆเจพ เจชเจฟเจ›เฉ‹เจ•เฉœ
  • N-เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจฒเจˆ CI/CD เจฐเฉ‹เจฒ เจ†เจŠเจŸ เจ•เจฐเจจ เจฒเจˆ เจคเจ•เจจเฉ€เจ•เฉ€ เจนเฉฑเจฒ

เจชเจนเจฟเจฒเจพ เจญเจพเจ— เจชเฉเจฐเจพเจฃเฉ‡ เจฆเจฟเจจเจพเจ‚ เจฒเจˆ เจตเจงเฉ‡เจฐเฉ‡ เจฏเจพเจฆเจพเจ‚ เจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจฆเฉ‚เจœเจพ เจ‡เฉฑเจ• เจ…เจจเฉเจญเจต เจนเฉˆ เจœเฉ‹ เจคเฉเจธเฉ€เจ‚ เจ†เจชเจฃเฉ‡ เจ†เจช เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹.

เจ‡เจคเจฟเจนเจพเจธเจ• เจคเฉŒเจฐ 'เจคเฉ‡ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจนเฉ‹เจ‡เจ† เจนเฉˆ

เจธเจพเจฒ 2015

เจ…เจธเฉ€เจ‚ เจนเฉเจฃเฉ‡ เจฎเฉ‹เจฌเจพเจˆเจฒ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจตเจฟเจ•เจธเจค เจ•เจฐเจจเจพ เจธเจผเฉเจฐเฉ‚ เจ•เฉ€เจคเจพ เจนเฉˆ, เจซเจฟเจฐ เจธเจพเจจเฉ‚เฉฐ เจฒเจ—เจพเจคเจพเจฐ เจเจ•เฉ€เจ•เจฐเจฃ, DevOps เจ…เจคเฉ‡ เจนเฉ‹เจฐ เจซเฉˆเจธเจผเจจเจฏเฉ‹เจ— เจšเฉ€เจœเจผเจพเจ‚ เจฌเจพเจฐเฉ‡ เจ•เฉเจ เจจเจนเฉ€เจ‚ เจชเจคเจพ เจธเฉ€เฅค เจนเจฐเฉ‡เจ• เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจ…เจชเจกเฉ‡เจŸ เจจเฉ‚เฉฐ เจกเจฟเจตเฉˆเจฒเจชเจฐ เจฆเฉเจ†เจฐเจพ เจ–เฉเจฆ เจ†เจชเจฃเฉ€ เจฎเจธเจผเฉ€เจจ เจคเฉ‹เจ‚ เจฐเฉ‹เจฒ เจ†เจŠเจŸ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€เฅค เจ…เจคเฉ‡ เจœเฉ‡เจ•เจฐ เจเจ‚เจกเจฐเฉŒเจ‡เจก เจฒเจˆ เจ‡เจน เจ•เจพเจซเจผเฉ€ เจธเจงเจพเจฐเจจ เจนเฉˆ - เจ…เจธเฉˆเจ‚เจฌเจฒ, เจนเจธเจคเจพเจ–เจฐเจฟเจค .apk เจ…เจคเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจ—เฉ‚เจ—เจฒ เจกเจฟเจตเฉˆเจฒเจชเจฐ เจ•เฉฐเจธเฉ‹เจฒ 'เจคเฉ‡ เจ…เจชเจฒเฉ‹เจก เจ•เฉ€เจคเจพ, เจซเจฟเจฐ เจ†เจˆเจ“เจเจธ เจฒเจˆ เจเจ•เจธเจ•เฉ‹เจก เจฆเฉเจ†เจฐเจพ เจคเจคเจ•เจพเจฒเฉ€ เจกเจฟเจธเจŸเฉเจฐเฉ€เจฌเจฟเจŠเจธเจผเจจ เจŸเฉ‚เจฒ เจจเฉ‡ เจธเจพเจจเฉ‚เฉฐ เจฌเจนเฉเจค เจตเจงเฉ€เจ† เจธเจผเจพเจฎเจพเจ‚ เจจเจพเจฒ เจ›เฉฑเจก เจฆเจฟเฉฑเจคเจพ - เจ†เจฐเจ•เจพเจˆเจต เจจเฉ‚เฉฐ เจกเจพเจŠเจจเจฒเฉ‹เจก เจ•เจฐเจจ เจฆเฉ€เจ†เจ‚ เจ•เฉ‹เจธเจผเจฟเจธเจผเจพเจ‚ เจ…เจ•เจธเจฐ เจ—เจฒเจคเฉ€เจ†เจ‚ เจตเจฟเฉฑเจš เจ–เจคเจฎ เจนเฉ‹ เจœเจพเจ‚เจฆเฉ€เจ†เจ‚ เจธเจจ เจ…เจคเฉ‡ เจธเจพเจจเฉ‚เฉฐ เจฆเฉเจฌเจพเจฐเจพ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเจจเฉ€ เจชเฉˆเจ‚เจฆเฉ€ เจธเฉ€เฅค เจ‡เจน เจชเจคเจพ เจšเจฒเจฟเจ† เจ•เจฟ เจธเจญ เจคเฉ‹เจ‚ เจ‰เฉฑเจจเจค เจกเจฟเจตเฉˆเจฒเจชเจฐ เจฎเจนเฉ€เจจเฉ‡ เจตเจฟเฉฑเจš เจ•เจˆ เจตเจพเจฐ เจ•เฉ‹เจก เจจเจนเฉ€เจ‚ เจฒเจฟเจ–เจฆเจพ, เจธเจ—เฉ‹เจ‚ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจจเฉ‚เฉฐ เจœเจพเจฐเฉ€ เจ•เจฐเจฆเจพ เจนเฉˆ.

เจธเจพเจฒ 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: เจธเจพเจฐเฉ‡ เจธเจ•เฉเจฐเจฟเจชเจŸ เจชเฉœเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจธเฉฐเจ–เฉ‡เจช เจ•เจฐเฉ‹ เจ…เจคเฉ‡ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจซเจพเจธเจŸเจซเจพเจˆเจฒ เจตเจฟเฉฑเจš เจฆเฉเจฌเจพเจฐเจพ เจฒเจฟเจ–เฉ‹

เจœเจฆเฉ‹เจ‚ เจ…เจธเฉ€เจ‚ เจธเจผเฉเจฐเฉ‚ เจ•เฉ€เจคเจพ, เจธเจพเจกเฉ€เจ†เจ‚ เจธเจ•เฉเจฐเจฟเจชเจŸเจพเจ‚ เจœเฉ‡เจจเจ•เจฟเจจเจธ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจธเจผเฉˆเฉฑเจฒ เจฒเจฟเจชเฉ€ เจตเจฟเฉฑเจš เจธเจพเจฐเฉ‡ เจ•เจฆเจฎเจพเจ‚ เจ…เจคเฉ‡ เจฌเฉˆเจธเจพเจ–เฉ€เจ†เจ‚ เจตเจพเจฒเฉ‡ เจ‡เฉฑเจ• เจซเฉเฉฑเจŸเจ•เฉŒเจฅ เจตเจพเจ‚เจ— เจฆเจฟเจ–เจพเจˆ เจฆเจฟเฉฐเจฆเฉ€เจ†เจ‚ เจธเจจเฅค เจ…เจธเฉ€เจ‚ เจ…เจœเฉ‡ เจคเฉฑเจ• เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจ…เจคเฉ‡ เจชเฉœเจพเจ… เจฆเฉเจ†เจฐเจพ เจตเฉฐเจก เจจเฉ‚เฉฐ เจจเจนเฉ€เจ‚ เจฌเจฆเจฒเจฟเจ† เจนเฉˆ.

เจ…เจธเฉ€เจ‚ เจฆเฉ‡เจ–เจฟเจ† เจ•เจฟ เจธเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจ•เฉ€ เจนเฉˆ เจ…เจคเฉ‡ 4 เจ•เจฆเจฎเจพเจ‚ เจฆเฉ€ เจชเจ›เจพเจฃ เจ•เฉ€เจคเฉ€ เจนเฉˆ เจœเฉ‹ เจธเจพเจกเฉ‡ CI/CD เจฆเฉ‡ เจตเจฐเจฃเจจ เจฆเฉ‡ เจ…เจจเฉเจ•เฉ‚เจฒ เจนเจจ:

  • เจฌเจฟเจฒเจก - เจจเจฟเจฐเจญเจฐเจคเจพ เจจเฉ‚เฉฐ เจธเจฅเจพเจชเจฟเจค เจ•เจฐเจจเจพ, เจ†เจฐเจ•เจพเจˆเจต เจจเฉ‚เฉฐ เจ‡เจ•เฉฑเจ เจพ เจ•เจฐเจจเจพ,
  • เจŸเฉˆเจธเจŸ โ€” เจกเจฟเจตเฉˆเจฒเจชเจฐ เจฏเฉ‚เจจเจฟเจŸ เจŸเฉˆเจธเจŸเจพเจ‚ เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจฃเจพ, เจ•เจตเจฐเฉ‡เจœ เจฆเฉ€ เจ—เจฃเจจเจพ เจ•เจฐเจจเจพ,
  • เจธเฉ‹เจจเจพเจฐ - เจธเจพเจฐเฉ‡ เจฒเจฟเจจเจŸเจฐ เจฒเจพเจ‚เจš เจ•เจฐเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจธเฉ‹เจจเจพเจฐเจ•เจฟเจŠเจฌ เจจเฉ‚เฉฐ เจฐเจฟเจชเฉ‹เจฐเจŸเจพเจ‚ เจญเฉ‡เจœเจฆเจพ เจนเฉˆ,
  • เจคเฉˆเจจเจพเจค โ€” เจ…เจฒเจซเจผเจพ (เจŸเฉˆเจธเจŸเจซเจฒเจพเจˆเจŸ) เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจ†เจฐเจŸเฉ€เจซเฉˆเจ•เจŸ เจญเฉ‡เจœเจฃเจพเฅค

เจ…เจคเฉ‡ เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ เจ•เจพเจฐเจตเจพเจˆเจ†เจ‚ เจตเจฟเฉฑเจš เจตเจฐเจคเฉ€เจ†เจ‚ เจ—เจˆเจ†เจ‚ เจ•เฉเฉฐเจœเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจ›เฉฑเจก เจ•เฉ‡ เจตเฉ‡เจฐเจตเจฟเจ†เจ‚ เจตเจฟเฉฑเจš เจจเจนเฉ€เจ‚ เจœเจพเจ‚เจฆเฉ‡, เจคเจพเจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เจน เจซเจพเจธเจŸเจซเจพเจˆเจฒ เจฎเจฟเจฒเฉ‡เจ—เฉ€:

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 เจ…เจธเฉˆเจ‚เจฌเจฒเฉ€ เจธเจ•เฉเจฐเจฟเจชเจŸเจพเจ‚ เจนเฉ‹เจฃเจ—เฉ€เจ†เจ‚ เจœเฉ‹ เจ•เจฟเจธเฉ‡ เจจเจพ เจ•เจฟเจธเฉ‡ เจคเจฐเฉ€เจ•เฉ‡ เจจเจพเจฒ เจ†เจชเจฃเฉ€ เจœเจผเจฟเฉฐเจฆเจ—เฉ€ เจœเฉ€เจ‰เจฃเฉ€เจ†เจ‚ เจธเจผเฉเจฐเฉ‚ เจ•เจฐ เจฆเฉ‡เจฃเจ—เฉ€เจ†เจ‚, เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจธเฉฐเจชเจพเจฆเจฟเจค เจ•เจฐเจจเจพ เจตเจงเฉ‡เจฐเฉ‡ เจฎเฉเจธเจผเจ•เจฒ เจนเฉ‹เจตเฉ‡เจ—เจพ, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจธเจ•เฉเจฐเจฟเจชเจŸเจพเจ‚ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€เจ†เจ‚ เจตเจฟเฉฑเจš เจšเจฒเฉ‡ เจœเจพเจฃเจ—เฉ€เจ†เจ‚, เจ…เจคเฉ‡ เจธเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจ‰เฉฑเจฅเฉ‡ เจชเจนเฉเฉฐเจš เจจเจนเฉ€เจ‚ เจธเฉ€เฅค เจ…เจคเฉ‡, เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡, เจ‡เจธ เจคเจฐเฉ€เจ•เฉ‡ เจจเจพเจฒ เจธเจพเจกเฉ‡ เจฆเจฐเจฆ เจจเฉ‚เฉฐ เจนเฉฑเจฒ เจ•เจฐเจจเจพ เจธเฉฐเจญเจต เจจเจนเฉ€เจ‚ เจนเฉ‹เจตเฉ‡เจ—เจพ.

เจฎเฉ‹เจฌเจพเจˆเจฒ 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 เจฆเฉเจ†เจฐเจพ เจฐเจฟเจ•เจพเจฐเจก เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจนเฉเจฃ เจŸเฉเฉฑเจŸเฉ€เจ†เจ‚ เจธเจ•เฉเจฐเจฟเจชเจŸเจพเจ‚ เจฆเฉ‡ เจฆเฉ‹เจธเจผเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจฒเฉฑเจญเจฃ เจฆเฉ€ เจ•เฉ‹เจˆ เจฒเฉ‹เฉœ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจ…เจคเฉ‡ เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡, เจนเฉเจฃ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เจธเจจเฉ‚เฉฐ เจคเฉ‹เฉœเจจ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเจจเฉ€ เจชเจตเฉ‡เจ—เฉ€เฅค

เจนเฉเจฃ เจ‡เจน เจฏเจ•เฉ€เจจเฉ€ เจ•เจฐเจจ เจฒเจˆ เจนเฉˆ

เจชเจนเจฟเจฒเจพเจ‚, เจ…เจธเฉ€เจ‚ เจธเจพเจฐเฉ€เจ†เจ‚ เจธเจ•เฉเจฐเจฟเจชเจŸเจพเจ‚ เจจเฉ‚เฉฐ เจ•เจพเจ‡เจฎ เจฐเฉฑเจ–เจฃ, เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ…เฉฑเจชเจกเฉ‡เจŸ เจ•เจฐเจจ เจ…เจคเฉ‡ เจ…เฉฑเจชเจกเฉ‡เจŸ เจฆเฉ‡ เจธเจพเจฐเฉ‡ เจจเจคเฉ€เจœเจฟเจ†เจ‚ เจจเฉ‚เฉฐ เจ เฉ€เจ• เจ•เจฐเจจ เจตเจฟเฉฑเจš เจธเจฎเจพเจ‚ เจฌเจฟเจคเจพเจ‡เจ† เจธเฉ€เฅค เจ‡เจน เจฌเจนเฉเจค เจจเจฟเจฐเจพเจธเจผเจพเจœเจจเจ• เจธเฉ€ เจœเจฆเฉ‹เจ‚ เจฐเฉ€เจฒเฉ€เจœเจผเจพเจ‚ เจตเจฟเฉฑเจš เจคเจฐเฉเฉฑเจŸเฉ€เจ†เจ‚ เจ…เจคเฉ‡ เจกเจพเจŠเจจเจŸเจพเจˆเจฎ เจฆเฉ‡ เจ•เจพเจฐเจจ เจธเจงเจพเจฐเจจ เจŸเจพเจˆเจชเฉ‹ เจธเจจ เจœเฉ‹ เจธเจผเฉˆเฉฑเจฒ เจธเจ•เฉเจฐเจฟเจชเจŸเจพเจ‚ เจฆเฉ‡ เจ‰เจฒเจเจฃ เจตเจฟเฉฑเจš เจŸเจฐเฉˆเจ• เจฐเฉฑเจ–เจฃเจพ เจฌเจนเฉเจค เจฎเฉเจธเจผเจ•เจฒ เจธเจจเฅค เจนเฉเจฃ เจ…เจœเจฟเจนเฉ€เจ†เจ‚ เจ—เจฒเจคเฉ€เจ†เจ‚ เจ˜เฉฑเจŸ เจคเฉ‹เจ‚ เจ˜เฉฑเจŸ เจนเฉ‹ เจ—เจˆเจ†เจ‚ เจนเจจเฅค เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจธเจพเจฐเฉ€เจ†เจ‚ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจตเจพเจฐ เจตเจฟเฉฑเจš เจฐเฉ‹เจฒเจ†เจŠเจŸ เจ•เฉ€เจคเฉ€เจ†เจ‚ เจœเจพเจ‚เจฆเฉ€เจ†เจ‚ เจนเจจเฅค เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจจเจตเฉ€เจ‚ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจจเฉ‚เฉฐ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจตเจฟเฉฑเจš เจชเจพเจ‰เจฃ เจฒเจˆ 15 เจฎเจฟเฉฐเจŸ เจฒเฉฑเจ—เจฆเฉ‡ เจนเจจ - CI 'เจคเฉ‡ เจ‡เฉฑเจ• เจŸเฉˆเจ‚เจชเจฒเฉ‡เจŸ เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจธเฉˆเจŸ เจ…เจช เจ•เจฐเฉ‹ เจ…เจคเฉ‡ เจกเจฟเจตเฉˆเจฒเจชเจฐ เจฆเฉ‡ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจตเจฟเฉฑเจš เจ•เฉเฉฐเจœเฉ€เจ†เจ‚ เจธเจผเจพเจฎเจฒ เจ•เจฐเฉ‹เฅค

เจ…เจœเจฟเจนเจพ เจฒเจ—เจฆเจพ เจนเฉˆ เจ•เจฟ เจเจ‚เจกเจฐเฉŒเจ‡เจก เจฒเจˆ เจซเจพเจธเจŸเจซเจพเจˆเจฒ เจ…เจคเฉ‡ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจนเจธเจคเจพเจ–เจฐ เจฆเฉ‡ เจจเจพเจฒ เจฌเจฟเฉฐเจฆเฉ‚ เจธเจชเฉฑเจธเจผเจŸ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจœเฉ‡เจ•เจฐ เจฒเฉ‡เจ– เจฆเจฟเจฒเจšเจธเจช เจนเฉˆ, เจคเจพเจ‚ เจฎเฉˆเจ‚ เจ‡เฉฑเจ• เจจเจฟเจฐเฉฐเจคเจฐเจคเจพ เจฒเจฟเจ–เจพเจ‚เจ—เจพ. เจŸเจฟเฉฑเจชเจฃเฉ€เจ†เจ‚ เจœเจพเจ‚ เจŸเฉˆเจฒเฉ€เจ—เฉเจฐเจพเจฎ 'เจคเฉ‡ "เจคเฉเจธเฉ€เจ‚ เจ‡เจธ เจธเจฎเฉฑเจธเจฟเจ† เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจนเฉฑเจฒ เจ•เจฐเฉ‹เจ—เฉ‡" เจคเฉเจนเจพเจกเฉ‡ เจธเจตเจพเจฒเจพเจ‚ เจœเจพเจ‚ เจธเฉเจเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจฆเฉ‡เจ– เจ•เฉ‡ เจฎเฉˆเจจเฉ‚เฉฐ เจ–เฉเจธเจผเฉ€ เจนเฉ‹เจตเฉ‡เจ—เฉ€ bashkirova.

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹