ืžืึธื‘ื™ืœ CICD ื“ืขืจืคืึทืจื•ื ื’: ืื™ื™ืŸ ืคืึทืกื˜ืœืึทื ืข ื ืึธืจืžืึทืœ ืคึฟืึทืจ ืคื™ืœืข ืจื™ืจืขื•ื•ื“ื™ืง ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื–

ืžืึธื‘ื™ืœ CICD ื“ืขืจืคืึทืจื•ื ื’: ืื™ื™ืŸ ืคืึทืกื˜ืœืึทื ืข ื ืึธืจืžืึทืœ ืคึฟืึทืจ ืคื™ืœืข ืจื™ืจืขื•ื•ื“ื™ืง ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื–
ืื™ืš ื•ื•ืึธืœื˜ ื•ื•ื™ ืฆื• ืจืขื“ืŸ ื•ื•ืขื’ืŸ ืงืขืกื™ื™ื“ืขืจื“ื™ืง ื™ื ืึทื’ืจื™ื™ืฉืึทืŸ ืื•ืŸ ืขืงืกืคึผืจืขืก ืคึฟืึทืจ ืจื™ืจืขื•ื•ื“ื™ืง ืึทืคึผืคึผืก ื ื™ืฆืŸ ืคืึทืกื˜ืœืึทื ืข. ื•ื•ื™ ืžื™ืจ ื™ื ืกื˜ืจื•ืžืขื ื˜ CI / CD ืื•ื™ืฃ ืึทืœืข ืจื™ืจืขื•ื•ื“ื™ืง ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื–, ื•ื•ื™ ืžื™ืจ ื’ืึทื˜ ื“ืึธืจื˜ ืื•ืŸ ื•ื•ืึธืก ื’ืขื˜ืจืืคืŸ ืื™ืŸ ื“ื™ ืกื•ืฃ.

ืขืก ืื™ื– ืฉื•ื™ืŸ ื’ืขื ื•ื’ ืžืึทื˜ืขืจื™ืึทืœ ืื•ื™ืฃ ื“ื™ ื ืขืฅ ืื•ื™ืฃ ื“ื™ ื’ืขืฆื™ื™ึทื’, ื•ื•ืึธืก ืžื™ืจ ื”ืึธื‘ืŸ ืึทื–ื•ื™ ื’ืขืคืขืœื˜ ืื™ืŸ ื“ื™ ืึธื ื”ื™ื™ื‘, ืึทื–ื•ื™ ืื™ืš ื•ื•ื™ืœ ื ื™ืฉื˜ ื‘ืึทืฉืจื™ื™ึทื‘ืŸ ื“ืขื ื’ืขืฆื™ื™ึทื’ ืื™ืŸ ื“ืขื˜ืึทืœ, ืึธื‘ืขืจ ื ืึธืจ ืึธืคึผืฉื™ืงืŸ ืฆื• ื•ื•ืึธืก ืžื™ืจ ื”ืึธื‘ืŸ ื“ืขืžืึธืœื˜:

ื“ืขืจ ืึทืจื˜ื™ืงืœ ื‘ืืฉื˜ื™ื™ื˜ ืคื•ืŸ ืฆื•ื•ื™ื™ ื˜ื™ื™ืœืŸ:

  • ื”ื™ื ื˜ืขืจื’ืจื•ื ื˜ ืฆื• ื“ื™ ื™ืžืขืจื“ื–ืฉืึทื ืก ืคื•ืŸ ืจื™ืจืขื•ื•ื“ื™ืง ืกื™ / ืกื™ ืื™ืŸ ื“ื™ ืคื™ืจืžืข
  • ื˜ืขื›ื ื™ืฉ ืœื™ื™ื–ื•ื ื’ ืคึฟืึทืจ ืจืึธื•ืœื™ื ื’ ืื•ื™ืก ืกื™ / ืกื™ ืคึฟืึทืจ N-ืึทืคึผืคึผืœื™ืงืึทื˜ื™ืึธื ืก

ื“ืขืจ ืขืจืฉื˜ืขืจ ื˜ื™ื™ืœ ืื™ื– ืžืขืจ ื‘ืขื ืงืฉืึทืคื˜ ืคึฟืึทืจ ื“ื™ ืึทืœื˜ ื˜ืขื’, ืื•ืŸ ื“ืขืจ ืฆื•ื•ื™ื™ื˜ืขืจ ืื™ื– ืึท ื“ืขืจืคืึทืจื•ื ื’ ื•ื•ืึธืก ืื™ืจ ืงืขื ืขืŸ ืฆื•ืœื™ื™ื’ืŸ ืฆื• ื–ื™ืš.

ืึทื–ื•ื™ ืื™ื– ื’ืขืฉืขืŸ ื”ื™ืกื˜ืึธืจื™ืฉ

ื™ืึธืจ 2015

ืžื™ืจ ื ืึธืจ ืกื˜ืึทืจื˜ืขื“ ื“ืขื•ื•ืขืœืึธืคึผื™ื ื’ ืจื™ืจืขื•ื•ื“ื™ืง ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื–, ื“ืขืžืึธืœื˜ ืžื™ืจ ื˜ืึธืŸ ื ื™ื˜ ื•ื•ื™ืกืŸ ืขืคึผืขืก ื•ื•ืขื’ืŸ ืงืขืกื™ื™ื“ืขืจื“ื™ืง ื™ื ืึทื’ืจื™ื™ืฉืึทืŸ, ื“ืขื•ื•ืึธืคึผืก ืื•ืŸ ืื ื“ืขืจืข ืžืึธื“ืขืจืŸ ื˜ื™ื ื’ื–. ื™ืขื“ืขืจ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ื“ืขืจื”ื™ื™ึทื ื˜ื™ืงืŸ ืื™ื– ืจืึธื•ืœื“ ืื•ื™ืก ื“ื•ืจืš ื“ื™ ื“ืขื•ื•ืขืœืึธืคึผืขืจ ื–ื™ืš ืคึฟื•ืŸ ื–ื™ื™ืŸ ืžืึทืฉื™ืŸ. ืื•ืŸ ืื•ื™ื‘ ืคึฟืึทืจ ืึทื ื“ืจื•ื™ื“ ืขืก ืื™ื– ื’ืึทื ืฅ ืคึผืฉื•ื˜ - ืคืืจื–ืืžืœื˜, ื’ืขื—ืชืžืขื˜ .apk ืื•ืŸ ื•ืคึผืœืึธืึทื“ืขื“ ืขืก ืฆื• ื“ื™ Google ื“ืขื•ื•ืขืœืึธืคึผืขืจ ืงืึทื ืกืึธื•ืœ, ื“ืขืžืึธืœื˜ ืคึฟืึทืจ ื™ืึธืก ื“ื™ ื“ืขืžืึธืœื˜ ืคืึทืจืฉืคึผืจื™ื™ื˜ื•ื ื’ ื’ืขืฆื™ื™ึทื’ ื“ื•ืจืš Xcode ืœื™ื ืงืก ืื•ื ื“ื– ืžื™ื˜ ื’ืจื•ื™ืก ื™ื•ื•ื ื™ื ื’ื– - ืคืจื•ื•ื•ืŸ ืฆื• ืึธืคึผืœืึธื“ื™ืจืŸ ื“ื™ ืึทืจืงื™ื™ื•ื• ืึธืคื˜ ื’ืขืขื ื“ื™ืงื˜ ืื™ืŸ ืขืจืจืึธืจืก ืื•ืŸ ืžื™ืจ ื”ืึธื‘ืŸ ืฆื• ืคึผืจื•ื‘ื™ืจืŸ ื•ื•ื™ื“ืขืจ. ืขืก ืคืืจืงืขืจื˜ ืื•ื™ืก ืึทื– ื“ื™ ืžืขืจืกื˜ ืึทื•ื•ืึทื ืกื™ืจื˜ืข ื“ืขื•ื•ืขืœืึธืคึผืขืจ ื˜ื•ื˜ ื ื™ืฉื˜ ืฉืจื™ื™ึทื‘ืŸ ืงืึธื“ ืขื˜ืœืขื›ืข ืžืึธืœ ืคึผืขืจ ื—ื•ื“ืฉ, ืึธื‘ืขืจ ื’ืึทื ืฅ ืจื™ืœื™ืกื™ื– ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ.

ื™ืึธืจ 2016

ืžื™ืจ ื–ืขื ืขืŸ ื’ืขื•ื•ืืงืกืŸ, ืžื™ืจ ื”ืึธื‘ืŸ ืฉื•ื™ืŸ ื’ืขื“ืึทื ืง ื•ื•ืขื’ืŸ ื•ื•ื™ ืฆื• ื‘ืึทืคืจื™ื™ึทืขืŸ ื“ืขื•ื•ืขืœืึธืคึผืขืจืก ืคื•ืŸ ืึท ื’ืึทื ืฅ ื˜ืึธื’ ืคึฟืึทืจ ืึท ืžืขืœื“ื•ื ื’, ืื•ืŸ ืึท ืฆื•ื•ื™ื™ื˜ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืื™ื– ืื•ื™ืš ืืจื•ื™ืก, ื•ื•ืึธืก ื ืึธืจ ืคึผื•ืฉื˜ ืื•ื ื“ื– ืžืขืจ ืฆื• ืึธื˜ืึทืžื™ื™ืฉืึทืŸ. ืื™ืŸ ื“ืขื ื–ืขืœื‘ืŸ ื™ืึธืจ, ืžื™ืจ ืื™ื ืกื˜ืึทืœื™ืจืŸ Jenkins ืคึฟืึทืจ ื“ื™ ืขืจืฉื˜ืขืจ ืžืึธืœ ืื•ืŸ ื’ืขืฉืจื™ื‘ืŸ ืึท ื‘ื™ื ื˜ืœ ืคื•ืŸ ืกืงืขืจื™ ืกืงืจื™ืคึผืก, ื–ื™ื™ืขืจ ืขื ืœืขืš ืฆื• ื“ื™ ื•ื•ืึธืก ืคืึทืกื˜ืœืึทื ืข ื•ื•ื™ื™ึทื–ืŸ ืื™ืŸ ื–ื™ื™ืŸ ื“ืึทืงื™ื•ืžืขื ื˜ื™ื™ืฉืึทืŸ.

$ 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, ื‘ืœื•ื™ื– ื“ื™ ื ืึธืžืขืŸ ืคื•ืŸ ื“ื™ ืฉืœื™ืกืœืขืŸ ืื™ื– ืงืœืึธืจ.

ื“ืึธืก ืžืึธืœ, ื“ืึทื ืง ืฆื• ืกืคึผืึธืจื˜ื–ืึทืœ ืื•ืŸ ื“ื™ ื’ืขื‘ื•ื™ื˜-ืื™ืŸ ืงืกืงืคึผืจืขื˜ื™ ืคืึธืจืžืึทื˜ื˜ืขืจ, ื“ื™ ื‘ื•ื™ืขืŸ ืœืึธื’ืก ื”ืึธื‘ืŸ ื•ื•ืขืจืŸ ืคื™ืœ ืžืขืจ ืœืขื“ื–ืฉืึทื‘ืึทืœ. ื“ืึธืก ื”ืึธื˜ ืึธื ื’ืขื”ื•ื™ื‘ืŸ ืฉืคึผืึธืจืŸ ืฆื™ื™ื˜ ืื•ื™ืฃ ืคื™ืงืกื™ืจ ืฆืขื‘ืจืื›ืŸ ืึทืกืขืžื‘ืœื™ื–, ืื•ืŸ ืžืืœ ื“ื™ ืžืขืœื“ื•ื ื’ ืžืึทื ืฉืึทืคึฟื˜ ืงืขืŸ ืจืขื›ืขื ืขืŸ ืขืก ืื•ื™ืก ืื•ื™ืฃ ื–ื™ื™ืขืจ ืื™ื™ื’ืŸ.

ืฆื•ื ื‘ืึทื“ื•ื™ืขืจืŸ, ืคึฟืึทืจื–ืึทืžืœื•ื ื’ ื’ื™ื›ืงื™ื™ึทื˜ ืžืขื–ืฉืขืจืžืึทื ืฅ xcodebuild ะธ gym ืžื™ืจ ื˜ืึธืŸ ื ื™ื˜ ื˜ืึธืŸ ื“ืึธืก, ืึธื‘ืขืจ ืžื™ืจ ื•ื•ืขืœืŸ ืฆื•ื˜ืจื•ื™ ื“ื™ ื“ืึทืงื™ื•ืžืขื ื˜ื™ื™ืฉืึทืŸ - ืึทืจื•ื™ืฃ ืฆื• 30% ื’ื™ื›ืงื™ื™ึทื˜.

ืื™ื™ืŸ ืคึผืจืึธืฆืขืก ืคึฟืึทืจ ืึทืœืข ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื–

ื™ืึธืจ 2018 ืื•ืŸ ืื™ืฆื˜

ืื™ืŸ 2018, ื“ืขืจ ืคึผืจืึธืฆืขืก ืคื•ืŸ ื‘ื•ื™ืขืŸ ืื•ืŸ ืจืึธื•ืœื™ื ื’ ืื•ื™ืก ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื– ื’ืึธืจ ืืจื™ื‘ืขืจื’ืขืคืืจืŸ ืฆื• Jenkins, ื“ืขื•ื•ืขืœืึธืคึผืขืจืก ืคืืจืฉื˜ืืคื˜ ืจื™ืœื™ืกื™ื ื’ ืคื•ืŸ ื–ื™ื™ืขืจ ืžืืฉื™ื ืขืŸ, ืื•ืŸ ื‘ืœื•ื™ื– ื“ื™ ืžืขืœื“ื•ื ื’ ืžืึทื ืฉืึทืคึฟื˜ ื”ืื˜ ื“ื™ ืจืขื›ื˜ ืฆื• ืžืขืœื“ื•ื ื’.

ืžื™ืจ ื”ืึธื‘ืŸ ืฉื•ื™ืŸ ื’ืขื•ื•ืืœื˜ ืฆื• ืคึฟืึทืจื‘ืขืกืขืจืŸ ื“ื™ ืงืึทื˜ืขืจ ืคื•ืŸ ื˜ืขืกืฅ ืื•ืŸ ืกื˜ืึทื˜ื™ืง ืึทื ืึทืœื™ืกื™ืก, ืื•ืŸ ืื•ื ื“ื–ืขืจ ืกืงืจื™ืคึผืก ื’ืขื•ื•ืืงืกืŸ ืื•ืŸ ื’ืขื•ื•ืืงืกืŸ. ื’ืขื•ื•ืืงืกืŸ ืื•ืŸ ื’ืขื‘ื™ื˜ืŸ ืฆื•ื–ืืžืขืŸ ืžื™ื˜ ืื•ื ื“ื–ืขืจ ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื–. ืื™ืŸ ื“ืขืจ ืฆื™ื™ื˜, ืขืก ื–ืขื ืขืŸ ื’ืขื•ื•ืขืŸ ื•ื•ืขื’ืŸ 10 ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื–, ืงืึทื ืกื™ื“ืขืจื™ื ื’ ืึทื– ืžื™ืจ ื”ืึธื‘ืŸ ืฆื•ื•ื™ื™ ืคึผืœืึทื˜ืคืึธืจืžืก, ื“ืึธืก ืื™ื– ื•ื•ืขื’ืŸ 20 "ืœืขื‘ืขื“ื™ืง" ืกืงืจื™ืคึผืก.

ื™ืขื“ืขืก ืžืืœ ื•ื•ืืก ืžื™ืจ ื”ืื‘ืŸ ื’ืขื•ื•ืืœื˜ ืฆื•ื’ืขื‘ืŸ ื ื ื™ื™ืข ืฉืจื™ื˜ ืฆื•ื ืฉืจื™ืคื˜, ื”ืื‘ืŸ ืžื™ืจ ื’ืขืžื•ื–ื˜ ืงืืคื™ืจืŸ-ืคืืกื˜ ื“ื™ ืฉื˜ื™ืงืœืขืš ืื™ืŸ ืืœืข ืฉืึธืœ ืฉืจื™ืคื˜ืŸ. ื˜ืึธืžืขืจ ืžื™ืจ ืงืขืŸ ื”ืึธื‘ืŸ ื’ืขืืจื‘ืขื˜ ืžืขืจ ืงืขืจืคืึทืœื™, ืึธื‘ืขืจ ืึธืคื˜ ืึทื–ืึท ืขื ื“ืขืจื•ื ื’ืขืŸ ืขื ื“ื™ืงื˜ ื–ื™ืš ืžื™ื˜ ื˜ื™ืคึผืึธืก, ื•ื•ืึธืก ืคืืจื•ื•ืื ื“ืœืขืŸ ืื™ืŸ ื™ื•ื•ื ื™ื ื’ื– ืคึฟืึทืจ ื“ื™ ืžืขืœื“ื•ื ื’ ืžืึทื ืฉืึทืคึฟื˜ ืฆื• ืคืึทืจืจื™ื›ื˜ืŸ ืกืงืจื™ืคึผืก ืื•ืŸ ื’ืขืคึฟื™ื ืขืŸ ืื•ื™ืก ื•ื•ืึธืก ืงืœื•ื’ ื‘ืึธื›ืขืจ ืฆื•ื’ืขื’ืขื‘ืŸ ื“ืขื ื‘ืึทืคึฟืขืœ ืื•ืŸ ื•ื•ืึธืก ืขืก ื˜ืึทืงืข ื˜ื•ื˜. ืื™ืŸ ืึทืœื’ืขืžื™ื™ืŸ, ืขืก ืงืขืŸ ื ื™ืฉื˜ ื–ื™ื™ืŸ ื’ืขื–ืึธื’ื˜ ืึทื– ื“ื™ ืกืงืจื™ืคึผืก ืคึฟืึทืจ ืคึฟืึทืจื–ืึทืžืœื•ื ื’ ืคึฟืึทืจ ืื™ื™ืŸ ืคึผืœืึทื˜ืคืึธืจืžืข ื–ืขื ืขืŸ ืœืคึผื—ื•ืช ืขืคึผืขืก ืขื ืœืขืš. ื›ืึธื˜ืฉ ื–ื™ื™ ื”ืึธื‘ืŸ ื–ื™ื›ืขืจ ื’ืขื˜ืืŸ ื“ื™ ื–ืขืœื‘ืข ื–ืึทืš.

ืื™ืŸ ืกื“ืจ ืฆื• ืึธื ื”ื™ื™ื‘ืŸ ืึท ืคึผืจืึธืฆืขืก ืคึฟืึทืจ ืึท ื ื™ื™ึทืข ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ, ืขืก ืื™ื– ื ื™ื™ื˜ื™ืง ืฆื• ืคืึทืจื‘ืจืขื ื’ืขืŸ ืึท ื˜ืึธื’ ืฆื• ืื•ื™ืกืงืœื™ื™ึทื‘ืŸ ืึท "ืคืจื™ืฉ" ื•ื•ืขืจืกื™ืข ืคื•ืŸ โ€‹โ€‹ื“ื™ ืกืงืจื™ืคึผืก, ื“ื™ื‘ืึทื’ ืขืก ืื•ืŸ ื–ืึธื’ืŸ ืึทื– "ื™ืึธ, ืขืก ืึทืจื‘ืขื˜."

ืื™ืŸ ื“ื™ ื–ื•ืžืขืจ ืคื•ืŸ 2018, ืžื™ืจ ืึทืžืึธืœ ื•ื•ื™ื“ืขืจ ื’ืขืงื•ืงื˜ ืฆื• ื“ื™ ื ืึธืš ื“ืขื•ื•ืขืœืึธืคึผื™ื ื’ ืคืึทืกื˜ืœืึทื ืข.

ืึทืจื‘ืขื˜ #1: ืกืึทืžืขืจื™ื™ื– ืึทืœืข ืฉืจื™ืคื˜ ืกื˜ืขืคึผืก ืื•ืŸ ืจื™ืจื™ื™ื˜ ื–ื™ื™ ืื™ืŸ Fastfile

ืฐืข ืŸ ืžื™ ืจ ื”ืื‘ ืŸ ื–ื™ ืš ืื ื’ืขื”ื•ื™ื‘ ืŸ ื”ืื‘ ืŸ ืื•ื ื“ื–ืขืจ ืข ืฉืจื™ืคื˜ ืŸ ืื•ื™ืกื’ืขื–ืขืŸ , ืฐ ื™ ื ืคื•ืกึพืฉื˜ืืฃ , ืฐืขืœื›ืข ืจ ืื™ ื– ื‘ืืฉื˜ืื ืข ืŸ ืคื• ืŸ ืืœ ืข ื˜ืจืขืค ืŸ ืื• ืŸ ืงืจืื› ืŸ ืื™ ืŸ ืืฒ ืŸ ืฉื™ื ืœ ืฉืจื™ืค ื˜ ืื™ ืŸ ื“ื–ืฉืขื ืงื™ื ืก . ืžื™ืจ ื”ืึธื‘ืŸ ื ื™ืฉื˜ ื ืึธืš ืกื•ื•ื™ื˜ืฉื˜ ืฆื• ืจืขืจื  - ืœื™ื ื™ืข ืื•ืŸ ื˜ื™ื™ืœ ื“ื•ืจืš ื‘ื™ื ืข.

ืžื™ืจ ื”ืึธื‘ืŸ ื’ืขืงื•ืงื˜ ืื•ื™ืฃ ื•ื•ืึธืก ืžื™ืจ ื”ืึธื‘ืŸ ืื•ืŸ ื™ื™ื“ืขื ืึทืคื™ื™ื“ 4 ืกื˜ืขืคึผืก ื•ื•ืึธืก ืคึผืึทืกื™ืง ื“ื™ ื‘ืึทืฉืจื™ื™ึทื‘ื•ื ื’ ืคื•ืŸ ืื•ื ื“ื–ืขืจ ืกื™ / ืกื™:

  • ื‘ื•ื™ืขืŸ - ื™ื ืกื˜ืึทืœื™ืจืŸ ื“ื™ืคึผืขื ื“ืึทื ืกื™ื–, ืึทืกืขืžื‘ืึทืœ ื“ื™ ืึทืจืงื™ื™ื•ื•,
  • ืคึผืจื•ื‘ื™ืจืŸ - ืคืœื™ืกื ื“ื™ืง ื“ืขื•ื•ืขืœืึธืคึผืขืจ ืึทืคึผืึทืจืึทื˜ ื˜ืขืกืฅ, ืงืึทืœืงื™ืึทืœื™ื™ื˜ื™ื ื’ ืงืึทื•ื•ืขืจื™ื“ื–ืฉ,
  • sonar - ืœืึธื ื˜ืฉื™ื– ืึทืœืข ืœื™ื™ื ื˜ืขืจื– ืื•ืŸ ืกืขื ื“ื– ืจื™ืคึผืึธืจืฅ ืฆื• SonarQube,
  • ืฆืขื•ื•ื™ืงืœืขืŸ - ืฉื™ืงืŸ ืึท ืึทืจื˜ืึทืคืึทืงื˜ ืฆื• ืึทืœืฃ (ื˜ืขืกื˜ืคืœื™ื’ื”ื˜).

ืื•ืŸ ืื•ื™ื‘ ืื™ืจ ื˜ืึธืŸ ื ื™ื˜ ื’ื™ื™ืŸ ืื™ืŸ ื“ืขื˜ืึทื™ืœืก, ืึธื•ืžื™ื˜ื™ื ื’ ื“ื™ ืฉืœื™ืกืœืขืŸ ื’ืขื ื™ืฆื˜ ืื™ืŸ ืึทืงืฉืึทื ื–, ืื™ืจ ื•ื•ืขื˜ ื‘ืึทืงื•ืžืขืŸ ื“ืขื 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.

ืื™ืฆื˜ ืื™ืŸ Jenkins ืื™ืจ ืงืขื ืขืŸ ืจื•ืคืŸ ืงื•ืจืฅ ืงืึทืžืึทื ื“ื– ื•ื•ืึธืก ื˜ืึธืŸ ื ื™ื˜ ื‘ืœืขืจ ื“ื™ ืžื™ื™ื ื•ื ื’ ืื•ืŸ ื–ืขื ืขืŸ ืœื™ื™ื›ื˜ ืœื™ื™ื ืขื•ื•ื“ื™ืง ื“ื•ืจืš ื“ื™ ืื•ื™ื’:

# fastlane ios <lane_name>

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

ื”ื•ืจื™, ืžื™ืจ ื–ืขื ืขืŸ ื’ืจื•ื™ืก

ื•ื•ืึธืก ื”ืึธื˜ ืื™ืจ ื‘ืึทืงื•ืžืขืŸ? ืงืœืึธืจ ืงืึทืžืึทื ื“ื– ืคึฟืึทืจ ื™ืขื“ืขืจ ืฉืจื™ื˜. ืงืœื™ื ื“ ืึทืจื•ื™ืฃ ืกืงืจื™ืคึผืก, ื ื™ื˜ืœื™ ืขืจื™ื™ื ื“ื–ืฉื“ ืื™ืŸ ืคืึทืกื˜ืœืึทื ืข ื˜ืขืงืขืก. ืคืจื™ื™ื ื“ืœืขืš, ืžื™ืจ ื’ืขืœืืคืŸ ืฆื• ื“ื™ ื“ืขื•ื•ืขืœืึธืคึผืขืจืก ืื•ืŸ ื’ืขื‘ืขื˜ืŸ ื–ื™ื™ ืฆื• ืœื™ื™ื’ืŸ ืึทืœืฅ ื–ื™ื™ ื“ืืจืฃ ืฆื• ื–ื™ื™ืขืจ ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™ื–.

ืื‘ืขืจ ืžื™ืจ ื”ืื‘ืŸ ืžื™ื˜ ื“ืขืจ ืฆื™ื™ื˜ ืื™ื™ื ื’ืขื–ืขืŸ, ืื– ืžื™ืจ ื•ื•ืขืœืŸ ื˜ืจืขืคืŸ ื“ื™ ื–ืขืœื‘ืข ืฉื•ื•ืขืจื™ื’ืงื™ื™ื˜ืŸ - ืžื™ืจ ื•ื•ืขืœืŸ ื ืืš ื”ืื‘ืŸ 20 ืืกื™ืคื”-ืฉืจื™ืคื˜ืŸ, ื•ื•ืืก ื•ื•ืขืœืŸ ืื–ื•ื™ ืื“ืขืจ ืื ื“ืขืจืŸ ืื ื”ื™ื™ื‘ืŸ ืœืขื‘ืŸ ื–ื™ื™ืขืจ ืื™ื™ื’ืขื ืข ืœืขื‘ืŸ, ืขืก ื•ื•ืขื˜ ื–ื™ื™ืŸ ืฉื•ื•ืขืจืขืจ ื–ื™ื™ ืฆื• ืจืขื“ืืงื˜ื™ืจืŸ, ื•ื•ื™ื‘ืืœื“ ื“ื™ ืฉืจื™ืคื˜ืŸ ื•ื•ืขืœืŸ ื–ื™ืš ืืจื™ื‘ืขืจืคื™ืจืŸ ืื™ืŸ ืจื™ืคืื–ื™ื˜ืืจืŸ, ืื•ืŸ ืžื™ืจ ื”ืื‘ืŸ ื ื™ืฉื˜ ื’ืขื”ืื˜ ืงืฒืŸ ืฆื•ื˜ืจื™ื˜ ื“ืืจื˜. ืื•ืŸ, ืื™ืŸ ืึทืœื’ืขืžื™ื™ืŸ, ืขืก ื•ื•ืขื˜ ื ื™ืฉื˜ ื–ื™ื™ืŸ ืžืขื’ืœืขืš ืฆื• ืกืึธืœื•ื•ืข ืื•ื ื“ื–ืขืจ ื•ื•ื™ื™ื˜ื™ืง ืึทื–ื•ื™.

ืžืึธื‘ื™ืœ CICD ื“ืขืจืคืึทืจื•ื ื’: ืื™ื™ืŸ ืคืึทืกื˜ืœืึทื ืข ื ืึธืจืžืึทืœ ืคึฟืึทืจ ืคื™ืœืข ืจื™ืจืขื•ื•ื“ื™ืง ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื–

ืึทืจื‘ืขื˜ #2: ื‘ืึทืงื•ืžืขืŸ ืึท ืื™ื™ืŸ ืคืึทืกื˜ืคื™ืœืข ืคึฟืึทืจ N ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื–

ืื™ืฆื˜ ืขืก ืžื™ื™ื ื˜ ืึทื– ืกืึทืœื•ื•ื™ื ื’ ื“ื™ ืคึผืจืึธื‘ืœืขื ืื™ื– ื ื™ืฉื˜ ืึทื–ื•ื™ ืฉื•ื•ืขืจ - ืฉื˜ืขืœืŸ ื“ื™ ื•ื•ืขืจื™ืึทื‘ืึทืœื–, ืื•ืŸ ืœืึธื–ืŸ ืก ื’ื™ื™ืŸ. ื™ืึธ, ืื™ืŸ ืคืึทืงื˜, ื“ืึธืก ืื™ื– ื•ื•ื™ ื“ื™ ืคึผืจืึธื‘ืœืขื ืื™ื– ืกืึทืœื•ื•ื“. ืื‘ืขืจ ืื™ืŸ ื“ืขื ืžืึธืžืขื ื˜ ื•ื•ืขืŸ ืžื™ืจ ื–ืขื ืขืŸ ืฉืจื•ื™ืฃ ืขืก ืึทืจื•ื™ืฃ, ืžื™ืจ ื”ืึธื‘ืŸ ื ื™ื˜ ืงื™ื™ืŸ ืขืงืกืคึผืขืจื˜ื™ื– ืื™ืŸ ืคืึทืกื˜ืœืึทื ืข ื–ื™ืš, ืื“ืขืจ ืื™ืŸ ืจื•ื‘ื™, ืื™ืŸ ื•ื•ืึธืก ืคืึทืกื˜ืœืึทื ืข ืื™ื– ื’ืขืฉืจื™ื‘ืŸ, ืื•ืŸ ื ื™ื˜ ื ื•ืฆื™ืง ื‘ื™ื™ืฉืคื™ืœืŸ ืื•ื™ืฃ ื“ื™ ื ืขืฅ - ืึทืœืขืžืขืŸ ื•ื•ืืก ื’ืขืฉืจื™ื‘ืŸ ื•ื•ืขื’ืŸ ืคืึทืกืœืึทืŸ ื“ืขืžืึธืœื˜ ืื™ื– ื’ืขื•ื•ืขืŸ ืœื™ืžื™ื˜ืขื“ ืฆื• ืึท ื‘ื™ื™ืฉืคึผื™ืœ ืคึฟืึทืจ ืื™ื™ืŸ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืคึฟืึทืจ ืื™ื™ืŸ ื“ืขื•ื•ืขืœืึธืคึผืขืจ.

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 ื”ืื˜ ืึท ืœื™ื™ื–ื•ื ื’ ืคึฟืึทืจ ื“ืขื: ืœืึธื•ื“ื™ื ื’ ื•ื•ืขืจื™ืึทื‘ืึทืœื– ื“ื•ืจืš ื“ืึธื˜ืขื ื•ื•. ื“ื™ ื“ืึทืงื™ื•ืžืขื ื˜ื™ื™ืฉืึทืŸ ื–ืื’ื˜ ืึทื– ืื•ื™ื‘ ืขืก ืื™ื– ื•ื•ื™ื›ื˜ื™ืง ืคึฟืึทืจ ืื™ืจ ืฆื• ืžืึทืกืข ืฉืœื™ืกืœืขืŸ ืคึฟืึทืจ ืคืึทืจืฉื™ื“ืขื ืข ืฆื•ื•ืขืงืŸ, ืฉืึทืคึฟืŸ ืขื˜ืœืขื›ืข ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ื˜ืขืงืขืก ืื™ืŸ ื“ื™ ืคืึทืกื˜ืœืึทื ืข ื•ื•ืขื’ื•ื•ื™ื™ึทื–ืขืจ .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

ืœื™ื ืงืก ื“ืขื ืœื™ื™ื–ื•ื ื’ ืคึฟืึทืจ ืื™ืฆื˜, ื›ืึธื˜ืฉ Fastlane ื”ืื˜ ืึท ืœื™ื™ื–ื•ื ื’ ืคึฟืึทืจ ื“ืึทื•ื ืœืึธื•ื“ื™ื ื’ Fastfile ื“ื•ืจืš ืึทืงืฆื™ืข import_from_git, ืึธื‘ืขืจ ืขืก ืึทืจื‘ืขื˜ ื‘ืœื•ื™ื– ืคึฟืึทืจ Fastfile, ืึธื‘ืขืจ ื ื™ืฉื˜ ืคึฟืึทืจ ืื ื“ืขืจืข ื˜ืขืงืขืก. ืื•ื™ื‘ ืื™ืจ ื•ื•ื™ืœืŸ "ื˜ืึทืงืข ืฉื™ื™ืŸ", ืื™ืจ ืงืขื ืขืŸ ืฉืจื™ื™ึทื‘ืŸ ื“ื™ื™ืŸ ืื™ื™ื’ืŸ action.

ื ืขื ืœืขืš ื’ืึทื ื’ ืื™ื– ื’ืขืžืื›ื˜ ืคึฟืึทืจ ืึทื ื“ืจื•ื™ื“ ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื– ืื•ืŸ ืจืขืึทืงื˜ื ืึทื˜ื™ื•ื•ืข, ื“ื™ ื˜ืขืงืขืก ื–ืขื ืขืŸ ืื™ืŸ ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™, ืึธื‘ืขืจ ืื™ืŸ ืคืึทืจืฉื™ื“ืขื ืข ืฆื•ื•ื™ื™ื’ืŸ iOS, android ะธ react_native.

ื•ื•ืขืŸ ื“ื™ ืžืขืœื“ื•ื ื’ ืžืึทื ืฉืึทืคึฟื˜ ื•ื•ื™ืœ ืฆื• ืœื™ื™ื’ืŸ ืขื˜ืœืขื›ืข ื ื™ื™ึทืข ืฉืจื™ื˜, ืขื ื“ืขืจื•ื ื’ืขืŸ ืื™ืŸ ื“ื™ ืฉืจื™ืคื˜ ื–ืขื ืขืŸ ืจืขืงืึธืจื“ืขื“ ื“ื•ืจืš MR ืื™ืŸ ื’ื™ื˜, ืขืก ืื™ื– ื ื™ื˜ ืžืขืจ ื“ืึทืจืคึฟืŸ ืฆื• ืงื•ืงืŸ ืคึฟืึทืจ ื“ื™ ืงื•ืœืคึผืจื™ืฅ ืคื•ืŸ ืฆืขื‘ืจืื›ืŸ ืกืงืจื™ืคึผืก, ืื•ืŸ ืื™ืŸ ืึทืœื’ืขืžื™ื™ืŸ, ืื™ืฆื˜ ืื™ืจ ื”ืึธื‘ืŸ ืฆื• ืคึผืจื•ื‘ื™ืจืŸ ืฆื• ื‘ืจืขื›ืŸ ืขืก.

ืื™ืฆื˜ ืึทื– ืก ืขืก ืคึฟืึทืจ ื–ื™ื›ืขืจ

ื‘ื™ื– ืึทื”ืขืจ, ืžื™ืจ ืคืืจื‘ืจืื›ื˜ ืฆื™ื™ื˜ ืฆื• ื”ืึทืœื˜ืŸ ืึทืœืข ื“ื™ ืกืงืจื™ืคึผืก, ืึทืคึผื“ื™ื™ื˜ื™ื ื’ ื–ื™ื™ ืื•ืŸ ืคื™ืงืกื™ืจ ืึทืœืข ื“ื™ ืงืึทื ืกืึทืงื•ื•ืขื ืกืึทื– ืคื•ืŸ ื“ืขืจื”ื™ื™ึทื ื˜ื™ืงื•ื ื’ืขืŸ. ืขืก ืื™ื– ื’ืขื•ื•ืขืŸ ื–ื™ื™ืขืจ ื“ื™ืกืึทืคึผื•ื™ื ื™ื“ ื•ื•ืขืŸ ื“ื™ ืกื™ื‘ื•ืช ืคึฟืึทืจ ืขืจืจืึธืจืก ืื•ืŸ ื“ืึทื•ื ื˜ื™ื™ื ืื™ืŸ ืจื™ืœื™ืกื™ื– ื–ืขื ืขืŸ ืคึผืฉื•ื˜ ื˜ื™ืคึผืึธืก ื•ื•ืึธืก ื–ืขื ืขืŸ ื’ืขื•ื•ืขืŸ ืึทื–ื•ื™ ืฉื•ื•ืขืจ ืฆื• ื”ืึทืœื˜ืŸ ืฉืคึผื•ืจ ืื™ืŸ ื“ื™ ืฆืขืžื™ืฉื•ื ื’ ืคื•ืŸ ืฉืึธืœ ืกืงืจื™ืคึผืก. ืื™ืฆื˜ ืึทื–ืึท ืขืจืจืึธืจืก ื–ืขื ืขืŸ ืจื™ื“ื•ืกื˜ ืฆื• ืึท ืžื™ื ื™ืžื•ื. ืขื ื“ืขืจื•ื ื’ืขืŸ ื–ืขื ืขืŸ ืจืึธื•ืœื“ ืื•ื™ืก ืฆื• ืึทืœืข ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื– ืื™ืŸ ืึทืžืึธืœ. ืื•ืŸ ืขืก ื ืขืžื˜ 15 ืžื™ื ื•ื˜ ืฆื• ืฉื˜ืขืœืŸ ืึท ื ื™ื™ึทืข ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืื™ืŸ ื“ืขื ืคึผืจืึธืฆืขืก - ืฉื˜ืขืœืŸ ืึท ืžื•ืกื˜ืขืจ ืจืขืจื  - ืœื™ื ื™ืข ืื•ื™ืฃ ืกื™ ืื•ืŸ ืœื™ื™ื’ืŸ ื“ื™ ืฉืœื™ืกืœืขืŸ ืฆื• ื“ื™ ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™ ืคื•ืŸ ื“ื™ ื“ืขื•ื•ืขืœืึธืคึผืขืจ.

ืขืก ืžื™ื™ื ื˜ ืึทื– ื“ื™ ืคื•ื ื˜ ืžื™ื˜ Fastfile ืคึฟืึทืจ ืึทื ื“ืจื•ื™ื“ ืื•ืŸ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ื›ืกื™ืžืข ื‘ืœื™ื™ื‘ื˜ ืึทื ื™ืงืกืคึผืœื™ื™ื ื“; ืื•ื™ื‘ ื“ืขืจ ืึทืจื˜ื™ืงืœ ืื™ื– ื˜ืฉื™ืงืึทื•ื•ืข, ืื™ืš ื•ื•ืขืœ ืฉืจื™ื™ึทื‘ืŸ ืึท ืงืึทื ื˜ื™ื ื™ื•ื™ื™ืฉืึทืŸ. ืื™ืš ื•ื•ืขื˜ ื–ื™ื™ืŸ ืฆื•ืคืจื™ื“ืŸ ืฆื• ื–ืขืŸ ื“ื™ื™ืŸ ืคึฟืจืื’ืŸ ืึธื“ืขืจ ืคึฟื™ืจืœื™ื™ื’ืŸ "ื•ื•ื™ ื•ื•ืึธืœื˜ ืื™ืจ ืกืึธืœื•ื•ืข ื“ืขื ืคึผืจืึธื‘ืœืขื" ืื™ืŸ ื“ื™ ื‘ืึทืžืขืจืงื•ื ื’ืขืŸ ืึธื“ืขืจ ืื•ื™ืฃ ื˜ืขืœืขื’ืจืึทื bashkirova.

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’