Fastlane ááᯠá¡áá¯á¶ážááŒá¯á ááá¯ááá¯ááºážá¡ááºááºáá»á¬ážá¡ááœáẠá
ááºáááºáááŒáẠáá±á«ááºážá
ááºááŒááºážááŸáá·áº áá±ážááá¯á·ááŒááºážá¡ááŒá±á¬ááºáž ááŒá±á¬ááŒááá¯áá«áááºá áá»áœááºá¯ááºááá¯á·ááẠááá¯ááá¯ááºážá¡ááá®áá±ážááŸááºážá¡á¬ážáá¯á¶ážááœáẠCI/CD ááᯠáááºááá¯á·á¡áá±á¬ááºá¡áááºáá±á¬áºáá¯á¶á áá»áœááºá¯ááºááá¯á·áá±á¬ááºááŸááá²á·áá¯á¶ááŸáá·áº á¡áá¯á¶ážááœáẠáá¬ááŒá
áºááœá¬ážááááºážá
áááááá¬áá±á«áºááŸá ááœááºáááºáá±á«áºááœáẠáá á¹á ááºážá¡áá¯á¶á¡áá±á¬ááºááŸááá±ááŒá®ááŒá áºááŒá®ážá á¡á ááá¯ááºážááœáẠáá»áœááºá¯ááºááá¯á· á¡ááœááºáá»áá¯á·áá²á·áá±áá±á¬ááŒá±á¬áá·áº áá»áœááºá¯ááºááẠá€áááááá¬ááᯠá¡áá±ážá áááºáá±á¬áºááŒáááºááá¯ááºáá±á¬áºáááºážá áá»áœááºá¯ááºááá¯á·ááœáẠááá¯á¡áá¬áá»á¬ážááá¯áᬠáááºááœáŸááºážáá«áááºá
ááá¬ážááẠfastlane á á¬ááœááºá á¬áááºáž á¡ááŒá¬ážáá¯áá¹ááá®áá»á¬ážá០á¥ááá¬áá»á¬áž Fastlane ááᯠá¡áá¯á¶ážááŒá¯á iOS á¡ááá®áá±ážááŸááºážáá»á¬áž á á¯á ááºážááŸá¯ááᯠáá»áœááºá¯ááºááá¯á· á¡ááá¯á¡áá»á±á¬áẠáá¯ááºáá±á¬ááºáá±ážáá«áááºá
áá±á¬ááºážáá«ážááœáẠá¡ááá¯ááºážááŸá áºááá¯ááºáž áá«áááºáááº-
- áá¯áá¹ááá®ááœáẠááá¯ááá¯ááºáž CI/CD áá±á«áºáá±á«ááºáá¬ááŒááºážá áá±á¬ááºáá¶
- N-á¡ááá®áá±ážááŸááºážáá»á¬ážá¡ááœáẠCI/CD áá¯ááºáá±ážáááºá¡ááœáẠáááºážááá¬ááá¯ááºáá¬ááŒá±ááŸááºážáá»ááº
áááá¡ááá¯ááºážá ááŸá±ážááááºá ááœááºážááœááºááœááºáá¬ááŒá áºááŒá®áž áá¯áááá¡ááá¯ááºážááá±á¬á· áááºááá¯ááºááá¯áẠá¡áá¯á¶ážáá»ááá¯ááºáá²á· á¡ááœá±á·á¡ááŒá¯á¶áá áºáá¯áá«á
áá«á áááá¯ááºážááŸá¬ ááŒá áºáá»ááºáá²á·áá¬
áá áºááŸá Ạ2015
áá»áœááºá¯ááºááá¯á·ááẠááá¯ááá¯ááºážá¡ááºááá®áá±ážááŸááºážáá»á¬ážááᯠá
áááºáá®ááœááºáá²á·ááŒá®ážá ááá¯á·áá±á¬áẠá
ááºáááºáááŒááºáá±á«ááºážá
ááºááŸá¯á DevOps ááŸáá·áº á¡ááŒá¬ážáá±ááºáááºááá·áºá¡áá¬áá»á¬ážá¡ááŒá±á¬ááºáž áá¬ááŸááááá²á·áá«á á¡ááá®áá±ážááŸááºážá¡ááºááááºáá
áºáá¯á
á®ááá¯ááºážááᯠáá±á¬á·ááºáá²áá±ážáá¬ážáá°ááá¯ááºááá¯ááºá áááºážáá
ááºá០áá¯ááºááœáŸááºáááºá Andriod á¡ááœááºááá¯áá«áá á
á¯á
ááºážáá¬ážá áááºááŸááºááá¯ážáá«á .apk
áááºážááᯠGoogle Developer Console ááœáẠá¡ááºáá¯ááºáá¯ááºááŒá®ážáá±á¬áẠiOS á¡ááœáẠXcode ááŸáá
áºááá·áº ááŒáá·áºáá»á®áá±ážáááááá¬ááẠáá»áœááºá¯ááºááá¯á·á¡á¬áž áá±á¬ááºážááœááºáá±á¬ááá±áááºážáá»á¬ážááŸáá·áºá¡áá° áá¬ážáá²á·ááẠ- áá±á¬áºááœááºážááá¯ááºááᯠáá±á«ááºážáá¯ááºáá¯ááºááẠááŒáá¯ážáááºážááŸá¯áá»á¬ážááẠáááŒá¬ááááá¯áááᯠá¡ááŸá¬ážá¡ááœááºážáá»á¬ážááŒáá·áº ááŒá®ážáá¯á¶ážááœá¬ážáá²á·ááŒá®áž áááºáá¶ááŒáá¯ážá
á¬ážáá²á·ááááºá á¡ááá·áºá¡ááŒáá·áºáá¯á¶áž developer ááẠáá
áºááá»áŸáẠáá¯ááºááᯠá¡ááŒáááºáá±á«ááºážáá»á¬ážá
áœá¬ ááá±ážáá² á¡ááá®áá±ážááŸááºážááᯠáá¯ááºáá±ážáááºá
áá áºááŸá Ạ2016
áá»áœááºá¯ááºááá¯á· ááŒá®ážááŒááºážáá¬á ááºá áá¯ááºáá±áá°áá»á¬ážá¡ááœáẠáá áºáá±á·áá¬áá¯á¶áž developer áá»á¬ážááᯠáááºáá²á·ááá¯á· á¡ááá²á·áááá¯ááºááá²ááá¯ááá·áº á¡ááœá±ážá¡ááŒááºáá»á¬áž ááŸááá¬ážááŒá®ážááŒá áºááŒá®ážá áá¯áááá¡ááá®áá±ážááŸááºážáá áºáᯠáá±á«áºáá¬ááŒá®áž áá»áœááºá¯ááºááá¯á·á¡á¬áž á¡ááá¯á¡áá»á±á¬ááºá áá áºááá¯á· ááá¯ááá¯ááœááºážááá¯á·á á±áá«áááºá ááá¯ááŸá áºááœááºáááºá áá»áœááºá¯ááºááá¯á·ááẠ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"
áá¶ááá±á¬ááºážá áœá¬ááŒáá·áºá ááá¯á¡áá»áááºá¡áá áá»áœááºá¯ááºááá¯á·á developer áá»á¬ážáᬠဠscripts áá»á¬áž á¡áá¯ááºáá¯ááºáá¯á¶ááŸáá·áº á€á¡áá¯á¶ážáá²á·áá±á¬á·áá»á¬ážááᯠáá¬ááŒá±á¬áá·áº ááá¯á¡ááºááŒá±á¬ááºáž ááááŒááŒá®áž áá áºáá¯áᯠáááºáá¶ááŒááºáá±á¬ááºááœá¬ážáá±á¬á¡áá«ááœáẠááŸááºáááºážáá»á¬ážááᯠááœá²ááŒááºážá áááºááŒá¬áááºá¡ááœáẠ"ááŸááá±á¬ááá±áááºážáá»á¬áž" ááᯠáááŸááá²á·áá«áááºá
áá áºááŸá Ạ2017
áá®ááŸá áºááŸá¬ fastlane ááá¯áá»áá¯áž á¡áá¬áá áºáá¯ááŸááááºááá¯áᬠááááá¯ááºááááºá á¡áá¯ááŸáááá±á¬áẠá¡áá»ááºá¡áááºááœá± áááœá±á·ááá°áž - áá áºáá¯ááᯠáááºááá¯á áááá²á áááºááá¯áá¯á¶ážáááá²á ááá¯áááááá¬ááẠááá¯á¡áá»áááºá ááŒááºážáá±áá²ááŒá áºáááº- á ááºáááºáááŒáẠá¡ááŸá¬ážáá»á¬ážá áá»áœááºá¯ááºááá¯á·ááᯠá áááºáá»ááºá á±áá²á·ááŒá®áž áááºážááá¯á·áááááŒá¯áá¬ážááá·áº ááŸá±á¬áºáááºáá±á¬ á¡ááá¯á¡áá»á±á¬ááºá áá áºááᯠáá¯á¶ááŒááºááẠáááºáá²áááºá
ááá¯á·áá±á¬áº fastlane core ááœááºáá«áááºáá±á¬á¡áááá¡áá¯á¶ážá¡áá±á¬ááºáá»á¬áž gym
О pilot
á¡á²áá«ááᯠá
áááºááá¯ááºáá«ááŒá®á
áá»áœááºá¯ááºááá¯á·á áá¬ááºááœáŸááºážáá»á¬ážááᯠá¡áááºážááẠááŒáŸáá·áºáááºáá¬ážáá«áááºá
$ fastlane gym â-workspace "Example.xcworkspace"
--scheme "AppName"
â-buildlog_path "/tmp"
-âclean
áááºážááá¯á·ááẠááá¯á¡ááºáá±á¬ parameters áá»á¬ážá¡á¬ážáá¯á¶ážááá¯ááºáá±á¬ááŒá±á¬áá·áºáá¬áá»áŸáẠááá¯ááá¯áá±á¬ááºážááœááºá¡á±á¬ááºááŒá¯áá¯ááºáá¬ážáá«áááºá xcodebuild
ááœáŸááºááŒááá¯áááºááŸá¬- gym
áááºáá±áá¬ááŸá¬ áá¬ááááºáᬠááá¯áá¬ááᯠá¡ááŸá®á¡ááá¯áááºážá
áœá¬ áá¬ážáááºááá¯ááºáá«áááá·áºáááºá ááá¯ááá¯áá±á¬ááºážááœááºáá±á¬ áá»áááºááŸáááŸá¯áá»á¬ážá¡ááœááºá áááºááẠáá±á¬á·áá»á¬ážáá²á·ááá¯á· áá°áá®áá±á¬ ááá¯ááºáá»á¬ážááᯠáááºááŸááºááá¯ááºáááºá xcodebuild
áá±á¬á·á¡áááºááᬠááá¯ááŸááºážáá«áááºá
á€áá áºááŒáááºááœááºá á¡á¬ážáá á¬ážáá¯á¶ááŸáá·áº áááºáááºáá¬ážáá±á¬ xcpretty áá±á¬áºáááºá áá¬ááŒá±á¬áá·áºá áááºáá±á¬ááºááŸá¯ááŸááºáááºážáá»á¬ážááẠááá¯ááá¯ááŸááºážáááºážáá¬áááºá áááºážá áá»ááºá á®ážáá±áá±á¬ á ááºážáá±ážááœá²áá»á¬ážááᯠááŒá¯ááŒááºááŒááºážá¡ááœáẠá¡áá»áááºáá¯ááºáááºáá¬á á±ááŒá®áž áá áºáá«áá áºáá¶ááœáẠááœáŸááºáááºáá±ážá¡ááœá²á·ááẠáááºážááᯠáááºážááá¯á·áá¬áᬠá¡ááŒá±ááŸá¬ááá¯ááºáááºá
áá¶ááá±á¬ááºážá
áœá¬áá²á áááºáááºááŸá¯á¡ááŒááºááŸá¯ááºážááá¯ááºážáá¬ááŸá¯áá»á¬áž xcodebuild
О gym
áááºážááᯠáá»áœááºá¯ááºááá¯á· ááá¯ááºáá²á·áá«á ááá¯á·áá±á¬áº 30% á¡ááŸáááºááŒáŸáá·áºááẠá
á¬ááœááºá
á¬áááºážááᯠáá¯á¶ááŒááºáá«áááºá
áá»áŸá±á¬ááºááœáŸá¬á¡á¬ážáá¯á¶ážá¡ááœáẠáá áºáá¯áááºážáá±á¬ áá¯ááºáááºážá ááº
2018 áá¯ááŸá áºááŸáá·áº áááºááŸá
2018 áá¯ááŸá áºááœááºá á¡ááá®áá±ážááŸááºážáá»á¬ážáááºáá±á¬ááºááŒááºážááŸáá·áº ááŒáá·áºáá»áááŒááºážáá¯ááºáááºážá ááºááẠJenkins ááá¯á· áá¯á¶ážáááŒá±á¬ááºážááœá¬ážáá²á·ááŒá®áž developer áá»á¬ážááẠáááºážááá¯á·áá ááºáá»á¬ážá០áá¯ááºááœáŸááºááŒááºážááᯠáááºááá·áºáá²á·ááŒá®áž ááŒáá·áºáá»ááá±ážá¡ááœá²á·ááᬠáá¯ááºááŒááºááá¯ááºááœáá·áºááŸááááºá
áá»áœááºá¯ááºááá¯á·ááẠá ááºážáááºááŸá¯áá»á¬ážááŸáá·áº áááºááŒáááºááŸá¯ááá¯ááºáᬠááœá²ááŒááºážá áááºááŒá¬ááŸá¯ááᯠááŒáŸáá·áºáááºááá¯ááŒá®ážááŒá áºá áá»áœááºá¯ááºááá¯á·á script áá»á¬ážááẠááŒá®ážááœá¬ážáá¬áᬠááŒá®ážááœá¬ážáá¬áá«áááºá áá»áœááºá¯ááºááá¯á·á á¡ááá®áá±ážááŸááºážáá»á¬ážááŸáá·áºá¡áá° ááŒá®ážááœá¬ážááŒá®áž ááŒá±á¬ááºážáá²áá²á·áááºá ááá¯á¡áá»áááºááœáẠá¡ááá®áá±ážááŸááºáž 10 áá¯ááá·áºááŸááááºá áá»áœááºá¯ááºááá¯á·ááœáẠááááºáá±á¬ááºážááŸá áºáá¯ááŸááááºááᯠááá·áºááœááºážá ááºážá á¬ážáá«á áááºážááẠ"á¡áááºááŸááºááŒááºáž" áá¬ááºááœáŸááºáž 20 ááá·áºááŸááááºá
áá¬ááºááœáŸááºážááœáẠá¡ááá·áºá¡áá áºáá áºáᯠáááºááá·áºááá¯ááá·áºá¡áá«ááá¯ááºážá á¡ááá¯ááºážá¡á áá»á¬ážááᯠshell script áá»á¬ážá¡á¬ážáá¯á¶ážáá²ááá¯á· áá°ážáá°áá°ážááá·áºááá«áááºá áá»áœááºá¯ááºááá¯á·ááẠááá¯ááá¯ááá¯áá áá¯ááºáá¯ááºáá±á¬ááºááá¯ááºáá±á¬áºáááºáž áááŒá¬ááááá¯áááᯠááá¯ááŒá±á¬ááºážáá²ááŸá¯áá»á¬ážááẠscripts áá»á¬ážááá¯ááŒááºáááºáááºááŸáá·áº áááºááá·áºá áááºáá±á¬ááºáá±ážááá¯ááá·áºááœááºážááŒá®áž áááºážááẠá¡ááŸááºááááºáá¯ááºáá±á¬ááºáááºááᯠááááŸááááºá¡ááœáẠáá¯ááºáá±áá±ážá¡ááœá²á·á¡ááœááºááá±ááá¯ááºážá¡ááŒá áºááá¯á· ááŒá±á¬ááºážáá²ááœá¬ážáá±á¬ typos ááŒáá·áº á¡áá¯á¶ážáááºááœá¬ážáá«áááºá áá±áá°áá»á¡á¬ážááŒáá·áºá ááááºáá±á¬ááºážáá áºáá¯á¡ááœáẠá á¯áá±ážááŸá¯á¡ááœáẠscripts áá»á¬ážááẠá¡áááºážáá¯á¶áž á¡áááºážáááºáááºáá°áááºáᯠáááŒá±á¬ááá¯ááºáá«á áá«âáá±ááá·áºâ áá°ááá¯á·âáá±áá»á¬áá¬âáá±á¬á· á¡áá°áá°áá«áá²á
á¡ááá®áá±ážááŸááºážá¡áá áºáá áºáá¯á¡ááœáẠáá¯ááºáááºážá ááºáá áºáá¯á áááºáááºá¡ááœááºá á€á ááá áºáá»á¬ážá "áááºáááºáá±á¬" áá¬ážááŸááºážááᯠááœá±ážáá»ááºáááºá áááºážááᯠá¡ááŸá¬ážááŸá¬ááŒááºááŒá®áž "áá¯ááºáá«áááºá áááºážááẠá¡áá¯ááºáá¯ááºáááº" áá¯ááŒá±á¬ááẠáá áºáááºá¡áá»áááºáá°áááºááá¯á¡ááºáá«áááºá
2018 ááœá±áá¬áá®ááœááºá áá»áœááºá¯ááºááá¯á·ááẠááœá¶á·ááŒáá¯ážáá²á¡ááŒááºáááºážáá®ááá¯á· áá áºáááºááŒááºáááºááŒáá·áºááŸá¯áá²á·áá«áááºá
Task #1- script á¡ááá·áºá¡á¬ážáá¯á¶ážááᯠá¡áá»ááºážáá»á¯ááºááŒá®áž Fastfile ááœáẠááŒááºáááºáá±ážáá¬ážáá«á
á áááºáá±á¬á¡áá«ááœááºá áá»áœááºá¯ááºááá¯á·á script áá»á¬ážááẠJenkins ááŸá shell script áá áºáá¯ááœáẠááŒá±ááŸááºážáá»á¬ážááŸáá·áº áá»áá¯ááºážáá±á¬ááºáá»á¬ážá¡á¬ážáá¯á¶ážáá«áááºááá·áº ááŒá±áá±á¬ááºá¡áááºááŸáá·áºáá°áá«áááºá áá»áœááºá¯ááºááá¯á·ááẠááá¯ááºááá¯ááºážááŸáá·áº á¡ááá¯ááºážááᯠá¡ááá·áºá¡ááá¯áẠáááŒá±á¬ááºážááá±ážáá«á
áá»áœááºá¯ááºááá¯á·ááẠáá»áœááºá¯ááºááá¯á·á CI/CD ááá±á¬áºááŒáá»ááºááŸáá·áºááá¯ááºáá®áá±á¬ á¡ááá·áº 4 áá¯ááᯠááŒáá·áºááŸá¯áá²á·ááŒá®ážá
- build - installing dependenciesá archive ááᯠáááºáááºááŒááºážá
- á ááºážáááºááŸá¯ - áá±á¬á·ááºáá²á¡ááºáá»ááºáá®áá¬áá°áá áºá ááºážáááºááŸá¯áá»á¬áž áá¯ááºáá±á¬ááºáá±ááŒááºážá ááœáŸááºážááŒá¯á¶ááœááºáá»ááºááŒááºážá
- sonar - á¡áááºááœá¶áá»á¬ážá¡á¬ážáá¯á¶ážááᯠááœáŸááºáááºááŒá®áž SonarQube ááá¯á· á¡á á®áááºáá¶á á¬áá»á¬áž áá±ážááá¯á·ááŒááºážá
- deploy â 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
á¡áááºááá°áá¬ááœááºá áá»áœááºá¯ááºááá¯á·áááºááŸááºááá¯ááá·áº ááá·áºáááºáá±á¬ááºáá»á¬ážá áá
áºá
áááºáá
áºááá¯ááºážáá¬ááŒá
áºáááº- á€á¡áá¬áá»á¬ážááẠáááºáá±á¬ááºááŸá¯ áá±á¬ááºáá»á¬ážááŒá
áºááẠ- á
á¶áááºááŸááºáá»ááºáá»á¬ážá ááœá²á·á
ááºážááŸá¯áá¯á¶á
á¶á á
á®áá¶ááŸá¯áááá¯ááá¯ááºá¡áááºáá»á¬ážá ááŒáá·áºááŒá°ážááŸá¯ááá·áºáááºáá»ááºáá»á¬áž - áá±á¬á·ááºáá²áá±ážáá¬ážáá°á¡áá±á¬áá·áºá Apple IDá á
áá¬ážááŸááºá á¡ááá®áá±ážááŸááºáž ID á
áááºááá¯á·ááŒá
áºáááºá on. áááá¡áá®ážá
ááºáá¯á¶ážá¡áá±ááŒáá·áºá á€áá±á¬á·á¡á¬ážáá¯á¶ážááᯠá¡áá°ážááá¯ááºáá»á¬ážááœáẠááá·áºáá¬ážáá«áááº- Gymfile
, Matchfile
О Appfile
.
ááᯠJenkins ááœáẠáááºááẠááŒááºááœááºážááᯠááŸá¯ááºáá«ážáááœá¬ážá á±áá² áá»ááºáá¯á¶ážááŒáá·áº á¡ááœááºááá° áááºááá¯ááºáá±á¬ á¡ááá¯áá±á¬ááºáá»á¬ážááᯠáá±á«áºááá¯ááá¯ááºáááº-
# fastlane ios <lane_name>
$ fastlane ios build
$ fastlane ios test
$ fastlane ios run_sonar
$ fastlane ios deploy
áá¬ážá áá«ááá¯á· á¡áááºážáá±á¬ááºážáááºá
áá¬ááá²á·áá²? á¡ááá·áºááá¯ááºážá¡ááœáẠááœáŸááºááŒá¬ážáá»ááºáá»á¬ážááᯠááŸááºážáááºážáá«á Fastlane ááá¯ááºáá»á¬ážááœáẠáááºáááºá áœá¬ á á®á á¥áºáá¬ážáá±á¬ script áá»á¬ážááᯠááŸááºážáááºážáá¬ážáááºá áááºážááŒá±á¬ááºá áœá¬ááŒáá·áºá áááºážááá¯á·á ááá¯ááŸá±á¬ááºáá¯á¶áá»á¬ážááœáẠááá¯á¡ááºááá»áŸááᯠááá·áºááœááºážáá±ážááẠáá±á¬á·ááºáá²áá±ážáá¬ážáá°áá»á¬ážáᶠááŒá±ážááœá¬ážáá«áááºá
áá«áá±ááá·áº áá°áá®áá²á·á¡áááºá¡áá²ááœá±ááᯠááŒá¯á¶ááœá±á·ááááºááá¯áᬠá¡áá»áááºáááºá០ááá±á¬áá±á«ááºáá²á·ááẠ- áá áºáááºážááá¯ááºáá áºáááºáž áá°ááá¯á·áá²á·ááá¯ááºááá¯ááºááááᯠá áááºá¡áááºááŸááºááá·áº á á¯á ááºážááŸá¯ áá¬ááºááœáŸááºáž 20 áᯠáá»ááºáá±áŠážááŸá¬ááŒá áºááŒá®ážá áá¬ááºááœáŸááºážááœá±á ááá¯ááŸá±á¬ááºáá¯á¶ááœá±áá®ááᯠááœáŸá±á·áá¬ážáá¬ááŒá±á¬áá·áº áááºážááŒááºááᬠááá¯áááºáá²áá«áááá·áºáááºá ááŒá®ážáá±á¬á· áá«ááá¯á·á¡á²áá®ááŸá¬ áááºááœáá·áºáááá²á·áá°ážá áá±áá¯áá»á¡á¬ážááŒáá·áºá áá»áœááºá¯ááºááá¯á·ááá¬áá»ááºááŸá¯ááᯠá€áááºážááŒáá·áº ááŒá±ááŸááºážááẠáááŒá áºááá¯ááºáá«á
Task #2- N á¡ááá®áá±ážááŸááºážáá»á¬ážá¡ááœáẠFastfile áá áºáá¯ááá°áá«á
á¡áᯠááŒá¿áá¬ááᯠááŒá±ááŸááºážááᬠááááºááááºáá°ážáááºááẠ- variable ááœá±ááᯠáááºááŸááºááŒá®áž ááœá¬ážááŒáá¡á±á¬ááºá áá¯ááºáááºá ááááºáá±á¬á· áá®ááŒá¿áá¬ááᯠááŒá±ááŸááºážáá²á·áá¬á ááá¯á·áá±á¬áº áá»áœááºá¯ááºááá¯á· áááºážááᯠáá±á¬ááºáá»ááºááá¯ááºáá±á¬á¡áá«ááœááºá fastlane ááá¯ááºááá¯ááºá Ruby ááœáẠáá»áœááºážáá»ááºááŸá¯ áááŸáááŒá±á¬ááºážá fastlane ááœáẠáá±ážáá¬ážáá±á¬á ááœááºáááºáá±á«áºááŸá á¡áá¯á¶ážáááºáá±á¬ á¥ááá¬áá»á¬áž áááŸááá«á fastlane á¡ááŒá±á¬ááºážáá±ážáá°ááá¯ááºážááẠapplication áá áºáá¯á¡ááœáẠá¥ááá¬áá áºáá¯á¡ááœááºáᬠááá·áºáááºáá¬ážáá«áááºá developer áá áºáŠážá
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 ááœáẠá€á¡áá¬á¡ááœáẠá¡ááŒá±áá
áºáá¯ááŸááááºá .env
, .env.default
, .env.development
.
ááá¯á·áá±á¬áẠá€á
á¬ááŒáá·áºááá¯ááºááᯠá¡áááºážáááºááœá²ááŒá¬ážá
áœá¬ áá¯á¶ážááẠáá¯á¶ážááŒááºáá²á·áááºá fastlane scripts áá»á¬ážááŸáá·áº áááºážá meta á¡áá»ááºá¡áááºáá»á¬ážááá¯ááá¯ááºáá² developer áá»á¬ážá repository ááœáẠáá±áá¬áá»ááŒáá«á
áá¯á·á ááá¯á·áá±á¬áº ááá¯ááºááŸá á€á¡ááá®áá±ážááŸááºážá áá°ážááŒá¬ážáá±á¬áá±á¬á·áá»á¬áž .env.appName
.
Sami á¡áááá«áẠFastfile
, Appfile
, Matchfile
О Gymfile
á¡á²áá«ááᯠáá®ážááŒá¬ážááá¯ááŸá±á¬ááºáá¯á¶ááŸá¬ ááŸááºáá¬ážáá«áááºá á¡ááŒá¬ážáááºáá±á¬ááºááŸá¯áá»á¬ážá០á
áá¬ážááŸááºáá±á¬á·áá«ááá·áº áá±á¬ááºáááºááá¯ááºáá
áºáá¯ááᯠááá¯áá±áá¬ááœáẠááŸááºáá¬ážáá«áááº- .env
.
á¥ááá¬áá
áºáá¯ááŒáá·áºááá¯ááºáá«áááºá
CI ááœááºá áá±á«áºááá¯ááŸá¯ááẠáá»á¬ážá áœá¬ááŒá±á¬ááºážáá²ááŒááºážáááŸááá«á áááá»áá±á¬á¡ááá®áá±ážááŸááºážáá áºáá¯á¡ááœáẠááœá²á·á ááºážááŸá¯áá®ážáá áºáá¯ááᯠááá·áºááœááºážáá¬ážáááº-
# fastlane ios <lane_name> --env appName
$ fastlane ios build --env appName
$ fastlane ios test --env appName
$ fastlane ios run_sonar --env appName
$ fastlane ios deploy --env appName
ááœáŸááºááŒá¬ážáá»ááºáá»á¬ážááᯠááá¯ááºáá±á¬ááºáá®á áá»áœááºá¯ááºááá¯á·á ááá¯ááŸá±á¬ááºáá¬áá±áá¬ááᯠ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 á¡ááœáẠá¡áá¬ážáá°á¡á
á¯á¶ááᯠááŒá¯áá¯ááºáá¬ážááŒá®ážá ááá¯ááºáá»á¬ážááẠáá°áá®áá±á¬ááá¯ááŸá±á¬ááºáá¯á¶ááœááºááŸááá±á¬áºáááºáž ááá°áá®áá±á¬á¡ááá¯ááºážá¡áááºáá»á¬ážááœáẠiOS
, android
О react_native
.
áá¯ááºáá±áá±ážá¡ááœá²á·ááẠá¡ááá·áºá¡áá áºá¡áá»áá¯á·ááᯠáááºááá·áºááá¯áá±á¬á¡áá«á áá¬ááºááœáŸááºážááŒá±á¬ááºážáá²ááŸá¯áá»á¬ážááᯠgit ááœáẠMR ááŸáá áºááá·áº ááŸááºáááºážáááºáá¬ážáááºááŒá áºááŒá®ážá áá»áá¯ážáá²á·áá±áá±á¬ script áá»á¬ážáááá¬ážáá¶áá»á¬ážááᯠááŸá¬ááœá±áááºáááá¯á¡ááºáá±á¬á·áá² áá±áá¯áá»á¡á¬ážááŒáá·áºá ááá¯á¡áá« áááºážááá¯áá»áá¯ážáá»ááºáááºááŒáá¯ážá á¬ážááááºááŒá áºáááºá
áá² áá«áá²áá±áá»á¬áááºá
ááááºá áá»áœááºá¯ááºááá¯á·ááẠáá¬ááºááœáŸááºážáá»á¬ážá¡á¬ážáá¯á¶ážááᯠááááºážááááºážááŒááºážá áááºážááá¯á·á¡á¬áž á¡ááºááááºáá¯ááºááŒááºážááŸáá·áº á¡ááºááááºáá»á¬ážá á¡áá»áá¯ážáááºá¡á¬ážáá¯á¶ážááᯠááŒá¯ááŒááºááŒááºážááá¯á·á¡ááœáẠá¡áá»áááºáá¯ááºáá²á·áááºá áá¯ááºáá±ááŸá¯áá»á¬ážááœáẠá¡ááŸá¬ážá¡ááœááºážáá»á¬ážááŸáá·áº áááºáá¬ážáá»áááºáá»á¬ážá¡ááœáẠá¡ááŒá±á¬ááºážááŒáá»ááºáá»á¬ážááẠshell scripts áá»á¬ážááœáẠááŒá±áá¬áá¶ááẠá¡ááœááºáááºáá²áá±á¬ ááá¯ážááŸááºážáá±á¬ á¡ááŸá¬ážáá»á¬ážááŒá áºááŒáá±á¬á¡áá« á¡ááœááºá áááºáá»ááºá áá¬ááŒá áºáá²á·ááááºá ááá¯ááá¯áá»áŸáẠááá¯á¡ááŸá¬ážáá»á¬ážááᯠá¡áááºážáá¯á¶ážááŒá áºá¡á±á¬áẠáá»áŸá±á¬á·áá»ááá¯ááºáá«á á¡ááŒá±á¬ááºážá¡áá²áá»á¬ážááᯠá¡ááá®áá±ážááŸááºážá¡á¬ážáá¯á¶ážáᶠáá áºááŒáá¯ááºááẠááá·áºááœááºážáá±ážáá«áááºá áá¯ááºáááºážá ááºááœáẠá¡ááá®áá±ážááŸááºážá¡áá áºáá áºáá¯ááᯠááá·áºááœááºážááẠ15 áááá áºááŒá¬ááẠ- CI ááœáẠááá°áá¬áá¯á¶á á¶ááá¯ááºááá¯ááºážááᯠáááºááŸááºááŒá®áž áá±á¬á·ááºáá²áá±ážáá¬ážáá°á ááá¯ááŸá±á¬ááºáááºážááá¯á· áá±á¬á·áá»á¬ážááá·áºáá«á
Android á¡ááœáẠFastfile ááŸáá·áº á¡ááá®áá±ážááŸááºáž áááºááŸááºáá«ááá·áº á¡áá»ááºááᯠáááŸááºážááŒááá±ážáᯠáááºááááºá áá±á¬ááºážáá«ážááẠá
áááºáááºá
á¬ážá
áá¬áá±á¬ááºážáá«áá áááºáá±ážáá«áááºá ááŸááºáá»ááºáá»á¬áž ááá¯á·ááá¯áẠTelegram ááœáẠáááºááá±ážááœááºážáá»á¬áž ááá¯á·ááá¯áẠá¡ááŒá¶ááŒá¯áá»ááºáá»á¬áž "á€ááŒá¿áá¬ááᯠáááºáááºááá¯á·ááŒá±ááŸááºážáááºáááºáž" ááá¯ááœá±á·ááŒááºáááá·áºá¡ááœáẠáááºážááŒá±á¬ááºáááá«áááºá
source: www.habr.com