เบ›เบฐโ€‹เบชเบปเบšโ€‹เบเบฒเบ™ CICD เป‚เบ—เบฅเบฐโ€‹เบชเบฑเบšโ€‹เบกเบทโ€‹เบ–เบทโ€‹: เบกเบฒเบ”โ€‹เบ•เบฐโ€‹เบ–เบฒเบ™ fastlane เบซเบ™เบถเปˆเบ‡โ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบโ€‹เบกเบทโ€‹เบ–เบทโ€‹เบˆเปเบฒโ€‹เบ™เบงเบ™โ€‹เบซเบผเบฒเบโ€‹

เบ›เบฐโ€‹เบชเบปเบšโ€‹เบเบฒเบ™ CICD เป‚เบ—เบฅเบฐโ€‹เบชเบฑเบšโ€‹เบกเบทโ€‹เบ–เบทโ€‹: เบกเบฒเบ”โ€‹เบ•เบฐโ€‹เบ–เบฒเบ™ fastlane เบซเบ™เบถเปˆเบ‡โ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบโ€‹เบกเบทโ€‹เบ–เบทโ€‹เบˆเปเบฒโ€‹เบ™เบงเบ™โ€‹เบซเบผเบฒเบโ€‹
เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบขเบฒเบเป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเป‚เบเบ‡เบขเปˆเบฒเบ‡เบ•เปเปˆเป€เบ™เบทเปˆเบญเบ‡เปเบฅเบฐเบเบฒเบ™เบˆเบฑเบ”เบชเบปเปˆเบ‡เบชเปเบฒเบฅเบฑเบšเปเบญเบฑเบšเบฏเบกเบทเบ–เบทเป‚เบ”เบเปƒเบŠเป‰ fastlane. เบžเบงเบเป€เบฎเบปเบฒเบ›เบฐเบ•เบดเบšเบฑเบ” CI/CD เปƒเบ™เบ—เบธเบเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบกเบทเบ–เบทเปเบ™เบงเปƒเบ”, เบžเบงเบเป€เบฎเบปเบฒเป„เบ›เบฎเบญเบ”เบšเปˆเบญเบ™เบ™เบฑเป‰เบ™เป„เบ”เป‰เปเบ™เบงเปƒเบ” เปเบฅเบฐเบชเบดเปˆเบ‡เบ—เบตเปˆเป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™เบ—เบตเปˆเบชเบธเบ”.

เบกเบตเบญเบธเบ›เบฐเบเบญเบ™เบเบฒเบ™เบžเบฝเบ‡เบžเปเปƒเบ™เป€เบ„เบทเบญเบ‚เปˆเบฒเบเปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เบกเบท, เป€เบŠเบดเปˆเบ‡เบžเบงเบเป€เบฎเบปเบฒเบ‚เบฒเบ”เปƒเบ™เบ•เบญเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, เบชเบฐเบ™เบฑเป‰เบ™เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเบšเปเปˆเบญเบฐเบ—เบดเบšเบฒเบเป€เบ„เบทเปˆเบญเบ‡เบกเบทเบขเปˆเบฒเบ‡เบฅเบฐเบญเบฝเบ”, เปเบ•เปˆเบˆเบฐเบญเป‰เบฒเบ‡เป€เบ–เบดเบ‡เบชเบดเปˆเบ‡เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบกเบตเปƒเบ™เป€เบงเบฅเบฒเบ™เบฑเป‰เบ™เป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™:

เบšเบปเบ”โ€‹เบ„เบงเบฒเบกโ€‹เบ›เบฐโ€‹เบเบญเบšโ€‹เบ”เป‰เบงเบโ€‹เบชเบญเบ‡โ€‹เบžเบฒเบโ€‹เบชเปˆเบงเบ™โ€‹:

  • เบ›เบฐเบซเบงเบฑเบ”เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบกเบฒเบ‚เบญเบ‡ CI/CD เบกเบทเบ–เบทเปƒเบ™เบšเปเบฅเบดเบชเบฑเบ”
  • เบเบฒเบ™เปเบเป‰เป„เบ‚เบ”เป‰เบฒเบ™เบงเบดเบŠเบฒเบเบฒเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบง CI/CD เบชเปเบฒเบฅเบฑเบš N-applications

เบžเบฒเบเบชเปˆเบงเบ™เบ—เปเบฒเบญเบดเบ”เปเบกเปˆเบ™ nostalgia เบซเบผเบฒเบเบชเปเบฒเบฅเบฑเบšเบกเบทเป‰เป€เบเบปเปˆเบฒ, เปเบฅเบฐเบ—เบตเบชเบญเบ‡เปเบกเปˆเบ™เบ›เบฐเบชเบปเบšเบเบฒเบ™เบ—เบตเปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ™เปเบฒเปƒเบŠเป‰เบเบฑเบšเบ•เบปเบงเบ—เปˆเบฒเบ™เป€เบญเบ‡.

เบ™เบตเป‰เปเบกเปˆเบ™เบงเบดเบ—เบตเบ—เบตเปˆเบกเบฑเบ™เป€เบเบตเบ”เบ‚เบถเป‰เบ™เปƒเบ™เบ›เบฐเบซเบงเบฑเบ”เบชเบฒเบ”

2015 เบ›เบต

เบžเบงเบเป€เบฎเบปเบฒเบซเบฒเบเปเปˆเป€เบฅเบตเปˆเบกเบžเบฑเบ”เบ—เบฐเบ™เบฒเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบกเบทเบ–เบท, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเบฎเบนเป‰เบซเบเบฑเบ‡เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเป‚เบเบ‡เบขเปˆเบฒเบ‡เบ•เปเปˆเป€เบ™เบทเปˆเบญเบ‡, เบเปˆเบฝเบงเบเบฑเบš DevOps เปเบฅเบฐเบชเบดเปˆเบ‡เบ‚เบญเบ‡เบ„เบปเบ™เบญเบฑเบšเป€เบ”เบ”: เบญเบทเปˆเบ™เป†. เบเบฒเบ™เบญเบฑเบšเป€เบ”เบ”เปเบ•เปˆเบฅเบฐเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เป„เบ”เป‰เบ–เบทเบ rolled เบญเบญเบเป‚เบ”เบเบœเบนเป‰เบžเบฑเบ”เบ—เบฐเบ™เบฒเป€เบญเบ‡เบˆเบฒเบเป€เบ„เบทเปˆเบญเบ‡เบ‚เบญเบ‡เบฅเบฒเบง. เปเบฅเบฐเบ–เป‰เบฒเบชเปเบฒเบฅเบฑเบš Android เบกเบฑเบ™เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบ‡เปˆเบฒเบเบ”เบฒเบ - เบ›เบฐเบเบญเบš, เบฅเบปเบ‡เบ™เบฒเบก .apk เปเบฅเบฐเบญเบฑเบšเป‚เบซเบฅเบ”เบกเบฑเบ™เปƒเบชเปˆ Google Developer Console, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบชเปเบฒเบฅเบฑเบš iOS เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบเบฒเบ™เปเบˆเบเบขเบฒเบเบœเปˆเบฒเบ™ Xcode เป„เบ”เป‰เบ›เปˆเบญเบเปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบ•เบญเบ™เปเบฅเบ‡เบ—เบตเปˆเบเบดเปˆเบ‡เปƒเบซเบเปˆ - เบ„เบงเบฒเบกเบžเบฐเบเบฒเบเบฒเบกเป€เบžเบทเปˆเบญเบ”เบฒเบงเป‚เบซเบฅเบ”เปเบŸเป‰เบกเบˆเบฑเบ”เป€เบเบฑเบšเบกเบฑเบเบˆเบฐเบชเบดเป‰เบ™เบชเบธเบ”เบฅเบปเบ‡เบ”เป‰เบงเบเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปเบฅเบฐเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบžเบฐเบเบฒเบเบฒเบกเบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡. เบกเบฑเบ™เป„เบ”เป‰เบซเบฑเบ™เบญเบญเบเบงเปˆเบฒเบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเบเป‰เบฒเบงเบซเบ™เป‰เบฒเบ—เบฒเบ‡เบ”เป‰เบฒเบ™เบซเบผเบฒเบเบ—เบตเปˆเบชเบธเบ”เบšเปเปˆเป„เบ”เป‰เบ‚เบฝเบ™เบฅเบฐเบซเบฑเบ”เบซเบผเบฒเบเบ„เบฑเป‰เบ‡เบ•เปเปˆเป€เบ”เบทเบญเบ™, เปเบ•เปˆเปเบ—เบ™เบ—เบตเปˆเบˆเบฐเบ›เปˆเบญเบเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™.

2016 เบ›เบต

เบžเบงเบเป€เบฎเบปเบฒเป€เบ•เบตเบšเปƒเบซเบเปˆเบ‚เบถเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบกเบตเบ„เบงเบฒเบกเบ„เบดเบ”เบเปˆเบฝเบงเบเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™เบ›เปˆเบญเบเบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเบˆเบฒเบเบกเบทเป‰เบ—เบฑเบ‡เบซเบกเบปเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เปˆเบญเบเบ•เบปเบง, เปเบฅเบฐเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ—เบตเบชเบญเบ‡เบเปเปˆเบ›เบฒเบเบปเบ”, เป€เบŠเบดเปˆเบ‡เบžเบฝเบ‡เปเบ•เปˆเบŠเบธเบเบเบนเป‰เบžเบงเบเป€เบฎเบปเบฒเป„เบ›เบชเบนเปˆเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”. เปƒเบ™เบ›เบตเบ”เบฝเบงเบเบฑเบ™, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบ•เบดเบ”เบ•เบฑเป‰เบ‡ Jenkins เป€เบ›เบฑเบ™เบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ”เปเบฅเบฐเบ‚เบฝเบ™เบ•เบปเบงเบญเบฑเบเบชเบญเบ™เบ—เบตเปˆเบซเบ™เป‰เบฒเบขเป‰เบฒเบ™เบซเบผเบฒเบ, เบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบเบฑเบšเบ—เบตเปˆ fastlane เบชเบฐเปเบ”เบ‡เบขเบนเปˆเปƒเบ™เป€เบญเบเบฐเบชเบฒเบ™เบ‚เบญเบ‡เบกเบฑเบ™.

$ 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 เบ›เบต

เบ›เบตเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฝเบ™เบฎเบนเป‰เบงเปˆเบฒเบกเบตเบชเบดเปˆเบ‡เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเป€เบŠเบฑเปˆเบ™ fastlane. เบšเปเปˆเบกเบตเบ‚เปเป‰เบกเบนเบ™เบซเบผเบฒเบเป€เบ—เบปเปˆเบฒเบ—เบตเปˆเบกเบตเปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™ - เบงเบดเบ—เบตเบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบซเบ™เบถเปˆเบ‡, เบงเบดเบ—เบตเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบกเบฑเบ™. เปเบฅเบฐเป€เบ„เบทเปˆเบญเบ‡เบกเบทเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡เปเบกเปˆเบ™เบเบฑเบ‡เบ‚เบตเป‰เบ•เบปเบงเบฐเปƒเบ™เป€เบงเบฅเบฒเบ™เบฑเป‰เบ™: เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ„เบปเบ‡เบ—เบตเปˆเบžเบฝเบ‡เปเบ•เปˆเป€เบฎเบฑเบ”เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบœเบดเบ”เบซเบงเบฑเบ‡เปเบฅเบฐเบกเบฑเบ™เบเบฒเบเบ—เบตเปˆเบˆเบฐเป€เบŠเบทเปˆเบญเปƒเบ™เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ” magical เบ—เบตเปˆเป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเบชเบฑเบ™เบเบฒเป„เบงเป‰.

เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบœเบปเบ™เบ›เบฐเป‚เบซเบเบ”เบ•เบปเป‰เบ™เบ•เปเบฅเบงเบกเบขเบนเปˆเปƒเบ™เบซเบผเบฑเบ fastlane เปเบกเปˆเบ™ gym ะธ pilot, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบˆเบฑเบ”เบเบฒเบ™เป€เบžเบทเปˆเบญเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบกเบฑเบ™.

เบชเบฐเบ„เบฃเบดเบšเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ›เบฑเบšเบ›เบธเบ‡เป€เบฅเบฑเบเบ™เป‰เบญเบ.

$ fastlane gym  โ€”-workspace "Example.xcworkspace" 
                --scheme "AppName" 
                โ€”-buildlog_path "/tmp" 
                -โ€”clean

เบžเบงเบเป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ–เบทเบเบ›เบฑเบšเบ›เบธเบ‡, เบ–เป‰เบฒเบซเบฒเบเบงเปˆเบฒเบžเบฝเบ‡เปเบ•เปˆเป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบšเปเปˆเปเบกเปˆเบ™เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™ xcodebuild, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบŠเบตเป‰เบšเบญเบ - gym เป€เบ›เบฑเบ™เป€เบญเบเบฐเบฅเบฒเบ”เบˆเบฐเป€เบ‚เบปเป‰เบฒเปƒเบˆเบšเปˆเบญเบ™เปƒเบ”เปเบฅเบฐเบชเบดเปˆเบ‡เบ—เบตเปˆเบขเบนเปˆ. เปเบฅเบฐเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฑเบšเบฅเบฐเบญเบฝเบ”เป€เบžเบตเปˆเบกเป€เบ•เบตเบก, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบเปเบฒเบ™เบปเบ”เบ„เบตเบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบขเบนเปˆเปƒเบ™ xcodebuild, เบžเบฝเบ‡เปเบ•เปˆเบเบฒเบ™เบ•เบฑเป‰เบ‡เบŠเบทเปˆเบ‚เบญเบ‡เบเบฐเปเบˆเปเบกเปˆเบ™เบˆเบฐเปเบˆเป‰เบ‡เบเบงเปˆเบฒ.

เป€เบงเบฅเบฒเบ™เบตเป‰, เบ‚เปเบ‚เบญเบšเปƒเบˆเบเบฑเบšเบซเป‰เบญเบ‡เบญเบญเบเบเปเบฒเบฅเบฑเบ‡เบเบฒเบเปเบฅเบฐเบ•เบปเบงเบชเป‰เบฒเบ‡เบฎเบนเบšเปเบšเบš xcpretty, เบšเบฑเบ™เบ—เบถเบเบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡เป„เบ”เป‰เบเบฒเบเป€เบ›เบฑเบ™เบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™เบเบงเปˆเบฒ. เบ™เบตเป‰เป„เบ”เป‰เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ—เบตเปˆเบˆเบฐเบŠเปˆเบงเบเบ›เบฐเบขเบฑเบ”เป€เบงเบฅเบฒเปƒเบ™เบเบฒเบ™เปเบเป‰เป„เบ‚เบเบฒเบ™เบ›เบฐเบเบญเบšเบ—เบตเปˆเปเบ•เบเบซเบฑเบ, เปเบฅเบฐเบšเบฒเบ‡เบ„เบฑเป‰เบ‡เบ—เบตเบกเบ‡เบฒเบ™เบ›เปˆเบญเบเบชเบฒเบกเบฒเบ”เบ„เบดเบ”เป„เบฅเปˆเบกเบฑเบ™เบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡.

เปเบ•เปˆเบซเบ™เป‰เบฒเป€เบชเบเบ”เบฒเบ, เบเบฒเบ™เบงเบฑเบ”เปเบ—เบเบ„เบงเบฒเบกเป„เบงเบเบฒเบ™เบ›เบฐเบเบญเบš xcodebuild ะธ gym เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบšเปเปˆโ€‹เป„เบ”เป‰โ€‹เป€เบฎเบฑเบ”โ€‹เบกเบฑเบ™, เปเบ•เปˆโ€‹เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบˆเบฐโ€‹เป„เบงเป‰โ€‹เบงเบฒเบ‡โ€‹เปƒเบˆโ€‹เป€เบญโ€‹เบเบฐโ€‹เบชเบฒเบ™ - เป€เบ–เบดเบ‡ 30โ€‹% speedup.

เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ”เบฝเบงเบชเปเบฒเบฅเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ—เบฑเบ‡เบซเบกเบปเบ”

เบ›เบต 2018 เปเบฅเบฐเบ›เบฐเบˆเบธเบšเบฑเบ™

เปƒเบ™เบ›เบต 2018, เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบชเป‰เบฒเบ‡เปเบฅเบฐเป€เบ›เบตเบ”เบ•เบปเบงเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเป„เบ”เป‰เบเป‰เบฒเบเป„เบ› Jenkins เบขเปˆเบฒเบ‡เบชเบปเบกเบšเบนเบ™, เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเป„เบ”เป‰เบขเบธเบ”เป€เบŠเบปเบฒเบเบฒเบ™เบ›เปˆเบญเบเบ•เบปเบงเบญเบญเบเบˆเบฒเบเป€เบ„เบทเปˆเบญเบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒ, เปเบฅเบฐเบกเบตเบžเบฝเบ‡เปเบ•เปˆเบ—เบตเบกเบ‡เบฒเบ™เบ›เปˆเบญเบเป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™เบ—เบตเปˆเบกเบตเบชเบดเบ”เบ—เบตเปˆเบˆเบฐเบ›เปˆเบญเบ.

เบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบžเบทเปˆเบญเบ›เบฑเบšเบ›เบธเบ‡เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบงเบ‚เบญเบ‡เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเปเบฅเบฐเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ„เบปเบ‡เบ—เบตเปˆ, เปเบฅเบฐเบชเบฐเบ„เบดเบšเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป€เบžเบตเปˆเบกเบ‚เบถเป‰เบ™เปเบฅเบฐเป€เบ•เบตเบšเปƒเบซเบเปˆ. เป€เบ•เบตเบšเปƒเบซเบเปˆเปเบฅเบฐเบ›เปˆเบฝเบ™เปเบ›เบ‡เบžเป‰เบญเบกเบเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ. เปƒเบ™เป€เบงเบฅเบฒเบ™เบฑเป‰เบ™, เบกเบตเบ›เบฐเบกเบฒเบ™ 10 เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ. เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบกเบตเบชเบญเบ‡เป€เบงเบ—เบต, เบ™เบฑเป‰เบ™เปเบกเปˆเบ™เบ›เบฐเบกเบฒเบ™ 20 scripts "เบ”เปเบฒเบฅเบปเบ‡เบŠเบตเบงเบดเบ”".

เบ—เบธเบเป†เบ„เบฑเป‰เบ‡เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบžเบตเปˆเบกเบ‚เบฑเป‰เบ™เบ•เบญเบ™เปƒเปเปˆเปƒเบซเป‰เบเบฑเบšเบชเบฐเบ„เบฃเบดเบš, เบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบ„เบฑเบ”เบฅเบญเบ-เบงเบฒเบ‡เบŠเบดเป‰เบ™เบชเปˆเบงเบ™เปƒเบชเปˆเปƒเบ™เบชเบฐเบ„เบฃเบดเบšเบ—เบฑเบ‡เปเบปเบ”. เบšเบฒเบ‡เบ—เบตเบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เบงเบฝเบเบขเปˆเบฒเบ‡เบฅเบฐเบกเบฑเบ”เบฅเบฐเบงเบฑเบ‡เบซเบผเบฒเบ, เปเบ•เปˆเป€เบฅเบทเป‰เบญเบเป†เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเป„เบ”เป‰เบชเบดเป‰เบ™เบชเบธเบ”เบฅเบปเบ‡เบ”เป‰เบงเบเบเบฒเบ™เบžเบดเบกเบœเบดเบ”, เป€เบŠเบดเปˆเบ‡เป„เบ”เป‰เบเบฒเบเป€เบ›เบฑเบ™เบ•เบญเบ™เปเบฅเบ‡เบชเปเบฒเบฅเบฑเบšเบ—เบตเบกเบ‡เบฒเบ™เบ›เปˆเบญเบเบ•เบปเบงเปเบเป‰เป„เบ‚เบชเบฐเบ„เบดเบšเปเบฅเบฐเบŠเบญเบเบซเบฒเบงเปˆเบฒเบ„เบปเบ™เบชเบฐเบซเบฅเบฒเบ”เปƒเบ”เบ—เบตเปˆเป€เบžเบตเปˆเบกเบ„เปเบฒเบชเบฑเปˆเบ‡เบ™เบตเป‰เปเบฅเบฐเบชเบดเปˆเบ‡เบ—เบตเปˆเบกเบฑเบ™เป€เบฎเบฑเบ”. เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›เปเบฅเป‰เบง, เบกเบฑเบ™เบšเปเปˆเบชเบฒเบกเบฒเบ”เป€เบงเบปเป‰เบฒเป„เบ”เป‰เบงเปˆเบฒเบชเบฐเบ„เบดเบšเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฐเบเบญเบšเบชเปเบฒเบฅเบฑเบšเป€เบงเบ—เบตเบซเบ™เบถเปˆเบ‡เปเบกเปˆเบ™เบกเบตเบ„เบงเบฒเบกเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบ. เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบžเบงเบเป€เบ‚เบปเบฒเปเบ™เปˆเบ™เบญเบ™เป„เบ”เป‰เป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ”เบฝเบงเบเบฑเบ™.

เป€เบžเบทเปˆเบญเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบชเปเบฒเบฅเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเปƒเบซเบกเปˆ, เบกเบฑเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เปƒเบŠเป‰เป€เบงเบฅเบฒเบซเบ™เบถเปˆเบ‡เบกเบทเป‰เป€เบžเบทเปˆเบญเป€เบฅเบทเบญเบเบชเบฐเบšเบฑเบš "เบชเบปเบ”" เบ‚เบญเบ‡เบชเบฐเบ„เบดเบšเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰, เปเบเป‰เป„เบ‚เบกเบฑเบ™เปเบฅเบฐเป€เบงเบปเป‰เบฒเบงเปˆเบฒ "เปเบกเปˆเบ™, เบกเบฑเบ™เป€เบฎเบฑเบ”เบงเบฝเบ."

เปƒเบ™เบŠเปˆเบงเบ‡เบฅเบถเบฐเป€เบšเบดเปˆเบ‡เบฎเป‰เบญเบ™เบ‚เบญเบ‡เบ›เบต 2018, เบžเบงเบเป€เบฎเบปเบฒเบญเบตเบเบ„เบฑเป‰เบ‡เปœเบถเปˆเบ‡เป„เบ”เป‰เป€เบšเบดเปˆเบ‡เบซเบฒเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบ—เบตเปˆเบเบฑเบ‡เบžเบฑเบ”เบ—เบฐเบ™เบฒเบขเบนเปˆ.

เบงเบฝเบเบ‡เบฒเบ™ #1: เบชเบฐเบซเบผเบธเบšเบ‚เบฑเป‰เบ™เบ•เบญเบ™เบชเบฐเบ„เบฃเบดเบšเบ—เบฑเบ‡เปเบปเบ” เปเบฅเบฐเบ‚เบฝเบ™เบ„เบทเบ™เปƒเบ™ Fastfile

เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, scripts เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเป€เบ›เบฑเบ™ footcloth เบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เปเบฅเบฐ crutches เปƒเบ™เบซเบ™เบถเปˆเบ‡ shell script เปƒเบ™ Jenkins. เบžเบงเบเป€เบฎเบปเบฒเบเบฑเบ‡เบšเปเปˆเบ—เบฑเบ™เป„เบ”เป‰เบ›เปˆเบฝเบ™เป„เบ›เบชเบนเปˆเบ—เปเปˆเปเบฅเบฐเบเบฒเบ™เปเบšเปˆเบ‡เปเบเบเบ•เบฒเบกเบ‚เบฑเป‰เบ™เบ•เบญเบ™.

เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เป€เบšเบดเปˆเบ‡เบชเบดเปˆเบ‡เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบกเบตเปเบฅเบฐเบเปเบฒเบ™เบปเบ” 4 เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบกเบเบฑเบšเบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบเบ‚เบญเบ‡ CI / CD เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ:

  • เบเบฒเบ™โ€‹เบเปเปˆโ€‹เบชเป‰เบฒเบ‡ - เบเบฒเบ™โ€‹เบ•เบดเบ”โ€‹เบ•เบฑเป‰เบ‡โ€‹เป€เบญโ€‹เบเบฐโ€‹เบชเบฒเบ™โ€‹, เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบเบญเบšโ€‹เบฎเบงเบšโ€‹เบฎเบงเบกโ€‹,
  • test โ€” เปเบฅเปˆเบ™โ€‹เบเบฒเบ™โ€‹เบ—เบปเบ”โ€‹เบชเบญเบšโ€‹เบซเบ™เปˆเบงเบโ€‹เบžเบฑเบ”โ€‹เบ—เบฐโ€‹เบ™เบฒโ€‹, เบเบฒเบ™โ€‹เบ„เบดเบ”โ€‹เป„เบฅเปˆโ€‹เบเบฒเบ™โ€‹เบ„เบธเป‰เบกโ€‹เบ„เบญเบ‡โ€‹,
  • sonar - เป€เบ›เบตเบ”โ€‹เบ•เบปเบงโ€‹เบ—เบฑเบ‡โ€‹เบซเบกเบปเบ” linters เปเบฅเบฐโ€‹เบชเบปเปˆเบ‡โ€‹เบšเบปเบ”โ€‹เบฅเบฒเบโ€‹เบ‡เบฒเบ™โ€‹เปƒเบซเป‰ SonarQubeโ€‹,
  • deploy โ€” เบชเบปเปˆเบ‡ artifact เบเบฑเบš alpha (TestFlight).

เปเบฅเบฐเบ–เป‰เบฒเบ—เปˆเบฒเบ™เบšเปเปˆเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบฅเบฒเบเบฅเบฐเบญเบฝเบ”, เบเบปเบเป€เบฅเบตเบเบเบฐเปเบˆเบ—เบตเปˆเปƒเบŠเป‰เปƒเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”, เบ—เปˆเบฒเบ™เบˆเบฐเป„เบ”เป‰เบฎเบฑเบš 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

เปƒเบ™โ€‹เบ„เบงเบฒเบกโ€‹เป€เบ›เบฑเบ™โ€‹เบˆเบดเบ‡, Fastfile เบ„เบฑเป‰เบ‡โ€‹เบ—เปเบฒโ€‹เบญเบดเบ”โ€‹เบ‚เบญเบ‡โ€‹เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เป„เบ”เป‰โ€‹เบเบฒเบโ€‹เป€เบ›เบฑเบ™โ€‹เบ—เบตเปˆโ€‹เบเบดเปˆเบ‡โ€‹เปƒเบซเบเปˆ, เบžเบดโ€‹เบˆเบฒโ€‹เบฅเบฐโ€‹เบ™เบฒโ€‹เบšเบฒเบ‡โ€‹เป„เบกเป‰โ€‹เบ—เปˆเบญเบ™โ€‹เบ—เบตเปˆโ€‹เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบเบฑเบ‡โ€‹เบ•เป‰เบญเบ‡โ€‹เบเบฒเบ™โ€‹เปเบฅเบฐโ€‹เบˆเปเบฒโ€‹เบ™เบงเบ™โ€‹เบ‚เบญเบ‡โ€‹เบ•เบปเบงโ€‹เบเปเบฒโ€‹เบ™เบปเบ”โ€‹เบเบฒเบ™โ€‹เบ—เบตเปˆโ€‹เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบ—เบปเบ”โ€‹เปเบ—เบ™:

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

เปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡, เบžเบฝเบ‡เปเบ•เปˆเบชเปˆเบงเบ™เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบฅเบฐเบšเบธ: เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เปเบกเปˆเบ™เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡ - schema, เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ, เบŠเบทเปˆเป‚เบ›เบฅเปเบเบฅเบกเบเบฒเบ™เบชเบฐเบซเบ™เบญเบ‡, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เปเบˆเบเบขเบฒเบ - Apple ID เบ‚เบญเบ‡เบšเบฑเบ™เบŠเบตเบœเบนเป‰เบžเบฑเบ”เบ—เบฐเบ™เบฒ, เบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™, ID เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™, เปเบฅเบฐเบญเบทเปˆเบ™เป†. เบชเบธเบ”. เป€เบ›เบฑเบ™เบเบฒเบ™เบ›เบฐเบกเบฒเบ™เบ—เปเบฒเบญเบดเบ”, เบžเบงเบเป€เบฎเบปเบฒเป€เบญเบปเบฒเบเบฐเปเบˆเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เปƒเบชเปˆเปƒเบ™เป„เบŸเบฅเปŒเบžเบดเป€เบชเบ” - Gymfile, Matchfile ะธ Appfile.

เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เปƒเบ™ Jenkins เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป‚เบ—เบซเบฒเบ„เปเบฒเบชเบฑเปˆเบ‡เบชเบฑเป‰เบ™เบ—เบตเปˆเบšเปเปˆเบกเบปเบงเบกเบธเบกเป€เบšเบดเปˆเบ‡เปเบฅเบฐเบชเบฒเบกเบฒเบ”เบญเปˆเบฒเบ™เป„เบ”เป‰เบ‡เปˆเบฒเบเบ”เป‰เบงเบเบ•เบฒ:

# fastlane ios <lane_name>

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

Hurray, เบžเบงเบเป€เบฎเบปเบฒเบ”เบตเบซเบผเบฒเบ

เป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบฎเบฑเบšเบซเบเบฑเบ‡? เบฅเป‰เบฒเบ‡เบ„เปเบฒเบชเบฑเปˆเบ‡เบชเปเบฒเบฅเบฑเบšเบ—เบธเบเบ‚เบฑเป‰เบ™เบ•เบญเบ™. เป€เบฎเบฑเบ”เบ„เบงเบฒเบกเบชเบฐเบญเบฒเบ”เบชเบฐเบ„เบดเบš, เบˆเบฑเบ”เบฅเบฝเบ‡เบขเปˆเบฒเบ‡เป€เบ›เบฑเบ™เบฅเบฐเบšเบฝเบšเปƒเบ™เป„เบŸเบฅเปŒ fastlane. เบ”เป‰เบงเบเบ„เบงเบฒเบกเบ›เบดเบ•เบดเบเบดเบ™เบ”เบต, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เปเบฅเปˆเบ™เป„เบ›เบซเบฒเบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเบ‚เปเปƒเบซเป‰เบžเบงเบเป€เบ‚เบปเบฒเป€เบžเบตเปˆเบกเบ—เบธเบเบขเปˆเบฒเบ‡เบ—เบตเปˆเป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เปƒเบชเปˆเบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒ.

เปเบ•เปˆเบžเบงเบเป€เบฎเบปเบฒเบฎเบฑเบšเบฎเบนเป‰เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบžเบปเบšเบเบฑเบšเบ„เบงเบฒเบกเบซเบเบธเป‰เบ‡เบเบฒเบเบ”เบฝเบงเบเบฑเบ™ - เบžเบงเบเป€เบฎเบปเบฒเบเบฑเบ‡เบกเบต 20 scripts เบ›เบฐเบเบญเบšเบ—เบตเปˆเบˆเบฐเบงเบดเบ—เบตเบเบฒเบ™เบซเบ™เบถเปˆเบ‡เบซเบผเบทเบงเบดเบ—เบตเบเบฒเบ™เบญเบทเปˆเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ”เปเบฒเบฅเบปเบ‡เบŠเบตเบงเบดเบ”เบ‚เบญเบ‡เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเป€เบญเบ‡, เบกเบฑเบ™เบˆเบฐเบกเบตเบ„เบงเบฒเบกเบซเบเบธเป‰เบ‡เบเบฒเบเบซเบผเบฒเบเบ—เบตเปˆเบˆเบฐเปเบเป‰เป„เบ‚เปƒเบซเป‰เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒ, เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒ scripts เบˆเบฐเบเป‰เบฒเบเป„เบ› repositories, เปเบฅเบฐเบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเบกเบตเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบšเปˆเบญเบ™เบ™เบฑเป‰เบ™. เปเบฅเบฐ, เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›, เบกเบฑเบ™เบˆเบฐเบšเปเปˆเบชเบฒเบกเบฒเบ”เปเบเป‰เป„เบ‚เบ„เบงเบฒเบกเป€เบˆเบฑเบšเบ›เบงเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบ”เป‰เบงเบเบงเบดเบ—เบตเบ™เบตเป‰.

เบ›เบฐโ€‹เบชเบปเบšโ€‹เบเบฒเบ™ CICD เป‚เบ—เบฅเบฐโ€‹เบชเบฑเบšโ€‹เบกเบทโ€‹เบ–เบทโ€‹: เบกเบฒเบ”โ€‹เบ•เบฐโ€‹เบ–เบฒเบ™ fastlane เบซเบ™เบถเปˆเบ‡โ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบโ€‹เบกเบทโ€‹เบ–เบทโ€‹เบˆเปเบฒโ€‹เบ™เบงเบ™โ€‹เบซเบผเบฒเบโ€‹

เบงเบฝเบเบ—เบตเปˆ 2: เป€เบญเบปเบฒ Fastfile เบ”เบฝเบงเบชเบณเบฅเบฑเบšเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ N

เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบกเบฑเบ™เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบเบฒเบ™เปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเปเบกเปˆเบ™เบšเปเปˆเบเบฒเบเบซเบผเบฒเบ - เบเปเบฒเบ™เบปเบ”เบ•เบปเบงเปเบ›, เปเบฅเบฐเปƒเบซเป‰เป„เบ›. เปเบกเปˆเบ™เปเบฅเป‰เบง, เปƒเบ™เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบˆเบดเบ‡, เบ™เบฑเป‰เบ™เปเบกเปˆเบ™เบงเบดเบ—เบตเบเบฒเบ™เปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒ. เปเบ•เปˆเปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒ screwed เบกเบฑเบ™เบ‚เบถเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเบกเบตเบ„เบงเบฒเบกเบŠเปเบฒเบ™เบฒเบ™เปƒเบ™ fastlane เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡, เบซเบผเบท Ruby, เปƒเบ™ fastlane เบ–เบทเบเบ‚เบฝเบ™, เบซเบผเบทเบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เปƒเบ™เป€เบ„เบทเบญเบ‚เปˆเบฒเบ - เบ—เบธเบเบ„เบปเบ™เบ—เบตเปˆเบ‚เบฝเบ™เบเปˆเบฝเบงเบเบฑเบš fastlane เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เป„เบ”เป‰เบ–เบทเบเบˆเปเบฒเบเบฑเบ”เป€เบ›เบฑเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบชเปเบฒเบฅเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบซเบ™เบถเปˆเบ‡เบชเปเบฒเบฅเบฑเบš เบœเบนเป‰โ€‹เบžเบฑเบ”โ€‹เบ—เบฐโ€‹เบ™เบฒโ€‹เบซเบ™เบถเปˆเบ‡โ€‹.

Fastlane เบชเบฒเบกเบฒเบ”เบˆเบฑเบ”เบเบฒเบ™เบเบฑเบšเบ•เบปเบงเปเบ›เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเป„เบ”เป‰, เปเบฅเบฐเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบžเบฐเบเบฒเบเบฒเบกเปเบฅเป‰เบงเป‚เบ”เบเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบฅเบฐเบซเบฑเบ” Keychain:

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, เบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบ„เบดเบ”เบญเบญเบเบงเบดเบ—เบตเบเบฒเบ™เบˆเบฑเบ”เบชเบปเปˆเบ‡เบžเบงเบเบกเบฑเบ™เบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™. Fastlane เบกเบตเบเบฒเบ™เปเบเป‰เป„เบ‚เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เบตเป‰: เบเบฒเบ™เป‚เบซเบผเบ”เบ•เบปเบงเปเบ›เบœเปˆเบฒเบ™ dotenv. เป€เบญเบเบฐเบชเบฒเบ™เบšเบญเบเบงเปˆเบฒเบ–เป‰เบฒเบกเบฑเบ™เบชเปเบฒเบ„เบฑเบ™เบชเปเบฒเบฅเบฑเบšเบ—เปˆเบฒเบ™เบ—เบตเปˆเบˆเบฐเป‚เบซเบฅเบ”เบเบฐเปเบˆเบชเปเบฒเบฅเบฑเบšเบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™, เบชเป‰เบฒเบ‡เป„เบŸเบฅเปŒเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบซเบผเบฒเบเปƒเบ™เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบต fastlane. .env, .env.default, .env.development.

เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเปƒเบŠเป‰เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบ™เบตเป‰เปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เป€เบฅเบฑเบเบ™เป‰เบญเบ. เปƒเบซเป‰เบขเบนเปˆเปƒเบ™เบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™เบ‚เบญเบ‡เบœเบนเป‰เบžเบฑเบ”เบ—เบฐเบ™เบฒเบšเปเปˆเปเบกเปˆเบ™เบชเบฐเบ„เบดเบš fastlane เปเบฅเบฐเบ‚เปเป‰เบกเบนเบ™ meta เบ‚เบญเบ‡เบกเบฑเบ™, เปเบ•เปˆเบเบฐเปเบˆเบ—เบตเปˆเป€เบ›เบฑเบ™เป€เบญเบเบฐเบฅเบฑเบเบ‚เบญเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ™เบตเป‰เบขเบนเปˆเปƒเบ™เป„เบŸเบฅเปŒ. .env.appName.

เบ•เบปเบ™เป€เบญเบ‡ Fastfile, Appfile, Matchfile ะธ Gymfile, เบžเบงเบเป€เบฎเบปเบฒเป€เบŠเบทเปˆเบญเบ‡เบกเบฑเบ™เบขเบนเปˆเปƒเบ™เบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ. เป„เบŸเบฅเปŒเป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบ—เบตเปˆเบกเบตเบฅเบฐเบซเบฑเบ”เบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™เบˆเบฒเบเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบญเบทเปˆเบ™เป„เบ”เป‰เบ–เบทเบเป€เบŠเบทเปˆเบญเบ‡เป„เบงเป‰เบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™ - .env.
เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบšเบดเปˆเบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡ เบ—เบตเปˆเบ™เบตเป‰.

เบ›เบฐโ€‹เบชเบปเบšโ€‹เบเบฒเบ™ CICD เป‚เบ—เบฅเบฐโ€‹เบชเบฑเบšโ€‹เบกเบทโ€‹เบ–เบทโ€‹: เบกเบฒเบ”โ€‹เบ•เบฐโ€‹เบ–เบฒเบ™ fastlane เบซเบ™เบถเปˆเบ‡โ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบโ€‹เบกเบทโ€‹เบ–เบทโ€‹เบˆเปเบฒโ€‹เบ™เบงเบ™โ€‹เบซเบผเบฒเบโ€‹

เปƒเบ™ 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

เบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡, เบžเบงเบเป€เบฎเบปเบฒเป‚เบซเบฅเบ” repository เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบ”เป‰เบงเบ scripts. เบšเปเปˆเบ‡เบฒเบกเบซเบผเบฒเบ:

git clone [email protected]/FastlaneCICD.git fastlane_temp

cp ./fastlane_temp/fastlane/* ./fastlane/
cp ./fastlane_temp/fastlane/.env fastlane/.env

เบ›เบฐเป„เบงเป‰เบเบฒเบ™เปเบเป‰เป„เบ‚เบ™เบตเป‰เบชเปเบฒเบฅเบฑเบšเปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™, เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒ Fastlane เบกเบตเบเบฒเบ™เปเบเป‰เป„เบ‚เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ”เบฒเบงเป‚เบซเบผเบ” Fastfile เบœเปˆเบฒเบ™ เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ” import_from_git, เปเบ•เปˆเบกเบฑเบ™เบžเบฝเบ‡เปเบ•เปˆเป€เบฎเบฑเบ”เบงเบฝเบเบชเปเบฒเบฅเบฑเบš Fastfile, เปเบ•เปˆเบšเปเปˆเปเบกเปˆเบ™เบชเปเบฒเบฅเบฑเบšเป„เบŸเบฅเปŒเบญเบทเปˆเบ™เป†. เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™ "เบ‡เบฒเบกเปเบ—เป‰เป†", เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ‚เบฝเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เป€เบญเบ‡ action.

เบŠเบธเบ”เบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เป„เบ”เป‰เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™เบชเปเบฒเบฅเบฑเบšเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ Android เปเบฅเบฐ ReactNative, เป„เบŸเบฅเปŒเปเบกเปˆเบ™เบขเบนเปˆเปƒเบ™ repository เบ”เบฝเบงเบเบฑเบ™, เปเบ•เปˆเบขเบนเปˆเปƒเบ™เบชเบฒเบ‚เบฒเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™. iOS, android ะธ react_native.

เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบ—เบตเบกเบ‡เบฒเบ™เบ›เปˆเบญเบเบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบžเบตเปˆเบกเบšเบฒเบ‡เบ‚เบฑเป‰เบ™เบ•เบญเบ™เปƒเบซเบกเปˆ, เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ‚เบญเบ‡เบชเบฐเบ„เบดเบšเบ–เบทเบเบšเบฑเบ™เบ—เบถเบเบœเปˆเบฒเบ™ MR เปƒเบ™ git, เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบŠเบญเบเบซเบฒเบœเบนเป‰เบฎเป‰เบฒเบเบ‚เบญเบ‡เบชเบฐเบ„เบดเบšเบ—เบตเปˆเปเบ•เบเบซเบฑเบ, เปเบฅเบฐเป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›เปเบฅเป‰เบง, เบ•เบญเบ™เบ™เบตเป‰เป€เบˆเบปเป‰เบฒเบ•เป‰เบญเบ‡เบžเบฐเบเบฒเบเบฒเบกเบ—เปเบฒเบฅเบฒเบเบกเบฑเบ™.

เบ”เบฝเบงเบ™เบตเป‰เบกเบฑเบ™เปเบ™เปˆเบ™เบญเบ™

เบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เปƒเบŠเป‰เป€เบงเบฅเบฒเปƒเบ™เบเบฒเบ™เบฎเบฑเบเบชเบฒเบชเบฐเบ„เบดเบšเบ—เบฑเบ‡เบซเบกเบปเบ”, เบ›เบฑเบšเบ›เบธเบ‡เปƒเบซเป‰เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเปเบฅเบฐเปเบเป‰เป„เบ‚เบœเบปเบ™เบชเบฐเบ—เป‰เบญเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡เบเบฒเบ™เบ›เบฑเบšเบ›เบธเบ‡. เบกเบฑเบ™เป€เบ›เบฑเบ™เป€เบฅเบทเปˆเบญเบ‡เบ—เบตเปˆเบซเบ™เป‰เบฒเบœเบดเบ”เบซเบงเบฑเบ‡เบซเบผเบฒเบเป€เบกเบทเปˆเบญเป€เบซเบ”เบœเบปเบ™เบชเปเบฒเบฅเบฑเบšเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปเบฅเบฐเบเบฒเบ™เบขเบธเบ”เป€เบงเบฅเบฒเปƒเบ™เบเบฒเบ™เบ›เปˆเบญเบเบญเบญเบเบกเบฒเปเบกเปˆเบ™เบเบฒเบ™เบžเบดเบกเปเบšเบšเบ‡เปˆเบฒเบเป†เบ—เบตเปˆเบเบฒเบเบ—เบตเปˆเบˆเบฐเบ•เบดเบ”เบ•เบฒเบกเบขเบนเปˆเปƒเบ™ jumble เบ‚เบญเบ‡ shell scripts. เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเป„เบ”เป‰เบ–เบทเบเบซเบผเบธเบ”เบฅเบปเบ‡เป€เบ›เบฑเบ™เบ•เปเบฒเปˆเบชเบธเบ”เบ—เบตเปˆ. เบเบฒเบ™โ€‹เบ›เปˆเบฝเบ™โ€‹เปเบ›เบ‡โ€‹เปเบกเปˆเบ™โ€‹เป„เบ”เป‰โ€‹เบเบปเบโ€‹เบญเบญเบโ€‹เป„เบ›โ€‹เปƒเบ™โ€‹เบ—เบธเบโ€‹เบ„เปเบฒโ€‹เบฎเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบฑเบโ€‹เปƒเบ™โ€‹เป€เบงโ€‹เบฅเบฒโ€‹เบ”เบฝเบงโ€‹เบเบฑเบ™โ€‹. เปเบฅเบฐเบกเบฑเบ™เปƒเบŠเป‰เป€เบงเบฅเบฒ 15 เบ™เบฒเบ—เบตเป€เบžเบทเปˆเบญเป€เบญเบปเบฒเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เปƒเบซเบกเปˆเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบ‚เบฐเบšเบงเบ™เบเบฒเบ™ - เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ—เปเปˆเปเบกเปˆเปเบšเบšเปƒเบ™ CI เปเบฅเบฐเป€เบžเบตเปˆเบกเบเบฐเปเบˆเปƒเบชเปˆเบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™เบ‚เบญเบ‡เบœเบนเป‰เบžเบฑเบ”เบ—เบฐเบ™เบฒ.

เบกเบฑเบ™เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบˆเบธเบ”เบ—เบตเปˆเบกเบต Fastfile เบชเปเบฒเบฅเบฑเบš Android เปเบฅเบฐเบฅเบฒเบเป€เบŠเบฑเบ™เบ‚เบญเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบเบฑเบ‡เบšเปเปˆเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบญเบฐเบ—เบดเบšเบฒเบ; เบ–เป‰เบฒเบšเบปเบ”เบ„เบงเบฒเบกเบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆ, เบ‚เป‰เบญเบเบˆเบฐเบ‚เบฝเบ™เบ•เปเปˆเป€เบ™เบทเปˆเบญเบ‡. เบ‚เป‰เบญเบเบˆเบฐเบ”เบตเปƒเบˆเบ—เบตเปˆเป€เบซเบฑเบ™เบ„เปเบฒเบ–เบฒเบกเบซเบผเบทเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒ "เป€เบˆเบปเป‰เบฒเบˆเบฐเปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบ™เบตเป‰เปเบ™เบงเปƒเบ”" เปƒเบ™เบ„เปเบฒเป€เบซเบฑเบ™เบซเบผเบทเปƒเบ™ Telegram bashkirova.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™