แ‹จแˆžแ‰ฃแ‹ญแˆ CICD แˆแˆแ‹ตแก แˆˆแ‰ฅแ‹™ แ‹จแˆžแ‰ฃแ‹ญแˆ แŠ แ•แˆŠแŠฌแˆฝแŠ–แ‰ฝ แŠ แŠ•แ‹ต แ‹จแˆแŒฃแŠ• แˆ˜แˆตแˆ˜แˆญ

แ‹จแˆžแ‰ฃแ‹ญแˆ CICD แˆแˆแ‹ตแก แˆˆแ‰ฅแ‹™ แ‹จแˆžแ‰ฃแ‹ญแˆ แŠ แ•แˆŠแŠฌแˆฝแŠ–แ‰ฝ แŠ แŠ•แ‹ต แ‹จแˆแŒฃแŠ• แˆ˜แˆตแˆ˜แˆญ
แˆแŒฃแŠ• แˆŒแŠ• แ‰ แˆ˜แŒ แ‰€แˆ แˆตแˆˆแˆžแ‰ฃแ‹ญแˆ แŠ แ•แˆŠแŠฌแˆฝแŠ–แ‰ฝ แˆตแˆˆ แ‰€แŒฃแ‹ญ แ‹แˆ…แ‹ฐแ‰ต แŠฅแŠ“ แˆ›แ‹ตแˆจแˆต แˆ›แ‹แˆซแ‰ต แŠฅแˆแˆแŒ‹แˆˆแˆแข แ‰ แˆแˆ‰แˆ แ‹จแˆžแ‰ฃแ‹ญแˆ แŠ แ•แˆŠแŠฌแˆฝแŠ–แ‰ฝ แˆ‹แ‹ญ CI/CD แŠฅแŠ•แ‹ดแ‰ต แŠฅแŠ•แ‹ฐแˆแŠ•แ‰ฐแŒˆแ‰ฅแˆจแ‹แฃ แŠฅแŠ•แ‹ดแ‰ต แŠฅแŠ•แ‹ฐแ‹ฐแˆจแˆตแŠ• แŠฅแŠ“ แ‰ แˆ˜แŒจแˆจแˆป แˆแŠ• แŠฅแŠ•แ‹ฐแ‰ฐแˆแŒ แˆจแข

แ‰ แˆ˜แˆณแˆชแ‹ซแ‹ แˆ‹แ‹ญ แ‰ แŠ แ‹แ‰ณแˆจ แˆ˜แˆจแ‰ก แˆ‹แ‹ญ แ‰€แ‹ตแˆžแ‹แŠ‘ แ‰ แ‰‚ แ‰แˆณแ‰แˆต แŠ แˆˆ แฃ แŠฅแŠ› แˆ˜แŒ€แˆ˜แˆชแ‹ซ แˆ‹แ‹ญ แ‹จแŒŽแ‹ฐแˆˆแŠ• แฃ แˆตแˆˆแˆ†แАแˆ แˆ˜แˆฃแˆชแ‹ซแ‹แŠ• แˆ†แŠ• แ‰ฅแ‹ฌ แ‰ แ‹แˆญแ‹แˆญ แŠ แˆแŒˆแˆแŒฝแˆ แฃ แŒแŠ• แ‹ซแŠ” แ‹ซแˆˆแŠ•แŠ• แ‰ฅแ‰ป แŠฅแŒ แ‰…แˆณแˆˆแˆ แข

แŒฝแˆ‘แ‰ แˆแˆˆแ‰ต แŠญแแˆŽแ‰ฝแŠ• แ‹ซแ‰€แˆ แАแ‹-

  • แ‰ แŠฉแ‰ฃแŠ•แ‹ซแ‹ แ‹แˆตแŒฅ แ‹จแˆžแ‰ฃแ‹ญแˆ CI / แˆฒแ‹ฒ แˆ˜แŠจแˆฐแ‰ต แ‹ณแˆซ
  • แˆˆแŠคแŠ•-แˆ˜แ‰ฐแŒแ‰ แˆชแ‹ซแ‹Žแ‰ฝ CI/CD แŠ• แˆˆแˆ˜แˆแ‰€แ‰… แ‰ดแŠญแŠ’แŠซแ‹Š แˆ˜แแ‰ตแˆ„

แ‹จแˆ˜แŒ€แˆ˜แˆชแ‹ซแ‹ แŠญแแˆ แˆˆแŠ แˆฎแŒŒแ‹ แ‰€แŠ“แ‰ต แ‹จแ‰ แˆˆแŒ  แŠ“แแ‰†แ‰ต แАแ‹, แˆแˆˆแ‰ฐแŠ›แ‹ แ‹ฐแŒแˆž แˆˆแˆซแˆตแ‹Ž แˆ›แˆ˜แˆแŠจแ‰ต แ‹จแˆšแ‰ฝแˆ‰แ‰ต แˆแˆแ‹ต แАแ‹.

แ‰ แ‰ณแˆชแŠญ แŠฅแŠ•แ‹ฒแˆ… แˆ†แА

2015 แ‹“.แˆ

แ‹จแˆžแ‰ฃแ‹ญแˆ แˆ˜แ‰ฐแŒแ‰ แˆชแ‹ซแ‹Žแ‰ฝแŠ• แˆ›แ‹˜แŒ‹แŒ€แ‰ต แŒ€แˆแˆจแŠ• แАแ‰ แˆญแฃ แŠฅแŠ“ แˆตแˆˆ แ‰€แŒฃแ‹ญแАแ‰ต แ‹ซแˆˆแ‹ แ‹แˆ…แ‹ฐแ‰ตแฃ DevOps แ‹ˆแ‹ญแˆ แˆŒแˆŽแ‰ฝ แ‹ตแŠ•แ‰… แАแŒˆแˆฎแ‰ฝ แˆแŠ•แˆ แ‹จแˆแŠ“แ‹แ‰€แ‹ แАแŒˆแˆญ แ‹จแˆˆแˆแข แŠฅแ‹ซแŠ•แ‹ณแŠ•แ‹ฑ แ‹จแˆ˜แ‰ฐแŒแ‰ แˆชแ‹ซ แ‹แˆ›แŠ” แ‰ แŒˆแŠ•แ‰ขแ‹ แˆซแˆฑ แŠจแˆซแˆฑ แˆ›แˆฝแŠ• แ‰ฐแˆˆแ‰‹แˆแข แŠฅแŠ“ แˆˆ Android แ‰ แŒฃแˆ แ‰€แˆ‹แˆ แАแ‹ - แ‰ฐแˆฐแ‰ฅแˆตแ‰ฆแฃ แ‰ฐแˆแˆญแˆŸแˆ .apk แŠฅแŠ“ แ‹ˆแ‹ฐ แŒŽแŒแˆ แŒˆแŠ•แ‰ข แŠฎแŠ•แˆถแˆ แˆฐแ‰…แˆˆแ‹‰ แŠจแ‹› แˆˆแŠ แ‹ญแŠฆแŠคแˆต แ‹จแ‹šแ‹ซแŠ• แŒŠแ‹œ แ‰ Xcode แˆ›แŠจแ‹แˆแ‹ซ แˆ˜แˆณแˆชแ‹ซ แŒฅแˆฉ แˆแˆฝแ‰ถแ‰ฝแŠ• แ‰ตแ‰ถแˆแŠ“แˆ - แˆ›แˆ…แ‹ฐแˆฉแŠ• แˆˆแˆ›แ‹แˆจแ‹ต แ‹จแ‰ฐแ‹ฐแˆจแŒˆแ‹‰ แˆ™แŠจแˆซ แ‰ฅแ‹™ แŒŠแ‹œ แ‰ แˆตแˆ…แ‰ฐแ‰ต แ‹ซแ‰ แ‰ƒแˆ แŠฅแŠ“ แŠฅแŠ•แ‹ฐแŒˆแŠ“ แˆ˜แˆžแŠจแˆญ แАแ‰ แˆจแ‰ฅแŠ•แข แ‰ แŒฃแˆ แ‹จแˆ‹แ‰ แŒˆแŠ•แ‰ข แ‰ แ‹ˆแˆญ แ‹แˆตแŒฅ แ‰ฅแ‹™ แŒŠแ‹œ แŠฎแ‹ต แŠ แ‹ญแŒฝแแˆ แฃ แ‹ญแˆแ‰แŠ•แˆ แˆ˜แ‰ฐแŒแ‰ แˆชแ‹ซแ‹แŠ• แ‹ญแˆˆแ‰€แ‰ƒแˆแข

2016 แ‹“.แˆ

แŠ แ‹ฐแŒแŠ• แฃ แŒˆแŠ•แ‰ขแ‹Žแ‰ฝแŠ• แˆˆแ‰€แŠ“แ‰ต แˆ™แˆ‰ แ‰€แŠ• แŠฅแŠ•แ‹ดแ‰ต แАแƒ แˆ›แ‹ตแˆจแŒ แŠฅแŠ•แ‹ฐแˆแŠ•แ‰ฝแˆ แŠ แˆตแ‰€แ‹ตแˆ˜แŠ• แŠ แˆตแ‰ แŠ• แАแ‰ แˆญ แฃ แŠฅแŠ“ แˆแˆˆแ‰ฐแŠ› แˆ˜แ‰ฐแŒแ‰ แˆชแ‹ซ แŠฅแŠ•แ‹ฒแˆ แ‰ณแ‹จ แฃ แ‹ญแˆ…แˆ แ‹จแ‰ แˆˆแŒ  แ‹ˆแ‹ฐ แŠ แ‹แ‰ถแˆœแˆฝแŠ• แ‰ฅแ‰ป แŒˆแ‹แŠ•แข แ‰ แ‹šแ‹ซแ‹ แ‹“แˆ˜แ‰ตแฃ แˆˆแˆ˜แŒ€แˆ˜แˆชแ‹ซ แŒŠแ‹œ แŒ„แŠ•แŠชแŠ•แˆตแŠ• แŒซแŠ•แŠ• แŠฅแŠ“ แŒแˆตแ‰ตแˆŒแŠ• แ‰ แˆฐแАแ‹ฑ แ‹แˆตแŒฅ แŠจแˆšแ‹ซแˆณแ‹จแ‹ แŒ‹แˆญ แ‰ฐแˆ˜แˆณแˆณแ‹ญ แ‹จแˆ†แŠ‘ แŠ แˆตแˆแˆช แˆตแŠญแˆชแ•แ‰ถแ‰ฝแŠ• แŒปแแŠ•แข

$ xcodebuild clean archive -archivePath build/MyApp 
    -scheme MyApp

$ xcodebuild -exportArchive 
                        -exportFormat ipa 
                        -archivePath "build/MyApp.xcarchive" 
                        -exportPath "build/MyApp.ipa" 
                        -exportProvisioningProfile "ProvisioningProfileName"

$ cd /Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/

$ ./altool โ€”upload-app 
-f {abs path to your project}/build/{release scheme}.ipa  
-u "appleId@example.com" 
-p "PASS_APPLE_ID"

แŠฅแŠ•แ‹ฐ แŠ แˆˆแˆ˜แ‰ณแ‹ฐแˆ แˆ†แŠ– แŠฅแˆตแŠจ แŠ แˆแŠ• แ‹ตแˆจแˆต แ‹จแŠฅแŠ› แŒˆแŠ•แ‰ขแ‹Žแ‰ฝ แ‰ฅแ‰ป แŠฅแАแ‹šแˆ… แˆตแŠญแˆชแ•แ‰ถแ‰ฝ แŠฅแŠ•แ‹ดแ‰ต แŠฅแŠ•แ‹ฐแˆšแˆ แˆฉ แŠฅแŠ“ แˆˆแˆแŠ• แ‹ญแˆ… แˆ›แˆˆแ‰‚แ‹ซ แ‹จแˆŒแˆˆแ‹ แ‹จแ‰แˆแ แ‰แˆแˆ แŠฅแŠ•แ‹ฐแˆšแ‹ซแˆตแˆแˆแŒ แ‹ซแ‹แ‰ แАแ‰ แˆญแฃ แŠฅแŠ“ แ‹จแˆ†แА แАแŒˆแˆญ แŠฅแŠ•แ‹ฐแŒˆแŠ“ แˆฒแˆฐแ‰ แˆญแฃ แˆ˜แ‹แŒˆแ‰ฆแ‰ฝแŠ• แˆˆแˆ˜แ‰ฐแŠ•แ‰ฐแŠ• โ€œแŠ แˆ›แˆฎแ‰ฝ แˆแˆฝแ‰ถแ‰ฝโ€ แŠ แŒแŠแ‰ฐแ‹‹แˆแข

2017 แ‹“.แˆ

แ‰ แ‹šแˆ… แŠ แˆ˜แ‰ต แ‹แˆตแ‰ตแˆ‹แ‹ญแŠ• แ‹จแˆšแ‰ฃแˆ แАแŒˆแˆญ แŠฅแŠ•แ‹ณแˆˆ แ‰ฐแˆแˆจแŠ“แˆแข แŠ แˆแŠ• แ‹ซแˆˆแ‹แŠ• แ‹ซแˆ…แˆ แ‰ฅแ‹™ แˆ˜แˆจแŒƒ แŠ แˆแАแ‰ แˆจแˆ - แŠฅแŠ•แ‹ดแ‰ต แŠฅแŠ•แ‹ฐแˆšแŒ€แˆ˜แˆญ แฃ แŠฅแŠ•แ‹ดแ‰ต แŠฅแŠ•แ‹ฐแˆšแŒ แ‰€แˆ™แ‰ แ‰ตแข แŠฅแŠ“ แˆ˜แˆณแˆชแ‹ซแ‹ แ‰ แ‹›แŠ• แŒŠแ‹œ แŒˆแŠ“ แ‹ซแˆแ‰ แˆฐแˆˆ แАแ‰ แˆญแก แ‹จแˆ›แ‹ซแ‰‹แˆญแŒฅ แˆตแˆ…แ‰ฐแ‰ถแ‰ฝ แŠฅแŠ›แŠ• แŠ แˆณแ‹˜แАแŠ• แŠฅแŠ“ แ‰ƒแˆ แ‰ แŒˆแ‰กแ‰ต แŠ แˆตแˆ›แ‰ณแ‹Š แŠ แ‹แ‰ถแˆ›แ‰ฒแŠญ แˆ›แˆ˜แŠ• แŠจแ‰ฃแ‹ต แАแ‰ แˆญแข

แˆ†แŠ–แˆ แŒแŠ•, แ‰  fastlane แŠฎแˆญ แ‹แˆตแŒฅ แ‹จแ‰ฐแŠซแ‰ฐแ‰ฑแ‰ต แ‹‹แŠ“ แ‹‹แŠ“ แˆ˜แŒˆแˆแŒˆแ‹ซแ‹Žแ‰ฝ แŠ“แ‰ธแ‹ gym ะธ pilot, แˆˆแˆ˜แŒ€แˆ˜แˆญ แ‰ฝแˆˆแŠ“แˆ.

แ‹จแŠฅแŠ› แˆตแŠญแˆชแ•แ‰ถแ‰ฝ แ‰ตแŠ•แˆฝ แ‰ฐแˆปแˆฝแˆˆแ‹‹แˆแข

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

แˆแˆ‰แˆ แŠ แˆตแˆแˆ‹แŒŠ แˆ˜แˆˆแŠชแ‹ซแ‹Žแ‰ฝ แˆตแˆ‹แˆแˆ†แŠ‘ แ‰ฅแ‰ป แ‰ฐแˆปแˆฝแˆˆแ‹‹แˆ xcodebuildแˆ›แˆ˜แˆแŠจแ‰ต แ‹ซแˆตแˆแˆแŒแ‹Žแ‰ณแˆ - gym แ‹จแ‰ต แŠฅแŠ“ แˆแŠ• แŠฅแŠ•แ‹ณแˆˆ แ‰ แŒแˆ แ‹ญแŒˆแАแ‹˜แ‰ฃแˆแข แŠฅแŠ“ แˆˆแ‰ แˆˆแŒ  แˆ›แˆตแ‰ฐแŠซแŠจแ‹ซแฃ แˆแŠญ แŠฅแŠ•แ‹ฐ แ‹แˆตแŒฅ แ‹ซแˆ‰ แ‰ฐแˆ˜แˆณแˆณแ‹ญ แ‰แˆแŽแ‰ฝแŠ• แˆ˜แŒแˆˆแŒฝ แ‹ญแ‰ฝแˆ‹แˆ‰แข xcodebuildแฃ แ‹จแ‰แˆแŽแ‰น แˆตแ‹ซแˆœ แ‰ฅแ‰ป แ‹จแ‰ แˆˆแŒ  แŒแˆแ… แАแ‹แข

แ‰ แ‹šแˆ… แŒŠแ‹œแฃ แˆˆแŒ‚แˆ แŠฅแŠ“ แŠ แ‰ฅแˆฎแŒˆแАแ‰ฅ แ‹จ xcpretty formatter แˆแˆตแŒ‹แŠ“ แ‹ญแŒแ‰ฃแ‹แŠ“ แ‹จแŒแŠ•แ‰ฃแ‰ณ แˆแ‹แŒแ‰ฅ แˆ›แˆตแ‰ณแ‹ˆแˆปแ‹Žแ‰ฝ แ‹จแ‰ แˆˆแŒ  แ‰ฐแАแ‰ฃแ‰ข แˆ†แАแ‹‹แˆแข แ‹ญแˆ… แ‹จแ‰ฐแ‰ แˆ‹แˆน แˆตแ‰ฅแˆฐแ‰ฃแ‹Žแ‰ฝแŠ• แˆˆแˆ›แˆตแ‰ฐแŠซแŠจแˆ แŒŠแ‹œแŠ• แˆ˜แ‰†แŒ แ‰ฅ แŒ€แˆ˜แˆจ แŠฅแŠ“ แŠ แŠ•แ‹ณแŠ•แ‹ต แŒŠแ‹œ แ‹จแ‰ฐแˆˆแ‰€แ‰€แ‹ แ‰กแ‹ตแŠ• แ‰ แˆซแˆฑ แˆŠแŒˆแАแ‹˜แ‰ แ‹ แ‹ญแ‰ฝแˆ‹แˆแข

แŠฅแŠ•แ‹ฐ แŠ แˆˆแˆ˜แ‰ณแ‹ฐแˆ แˆ†แŠ– แ‹จแˆ˜แˆฐแ‰ฅแˆฐแ‰ขแ‹ซ แแŒฅแАแ‰ต แˆ˜แˆˆแŠชแ‹ซแ‹Žแ‰ฝ xcodebuild ะธ gym แŠฅแŠ› แŠ แˆ‹แ‹ฐแˆจแŒแАแ‹แˆแฃ แАแŒˆแˆญ แŒแŠ• แˆฐแАแ‹ถแ‰นแŠ• แŠฅแŠ“แˆแŠ“แˆˆแŠ• - แŠฅแˆตแŠจ 30% แแŒฅแАแ‰ตแข

แАแŒ แˆ‹ แˆ‚แ‹ฐแ‰ต แˆˆแˆแˆ‰แˆ แˆ˜แ‰ฐแŒแ‰ แˆชแ‹ซแ‹Žแ‰ฝ

2018 แŠฅแŠ“ แŠ แˆแŠ•

แŠฅ.แŠค.แŠ . แ‰  2018 แฃ แˆ˜แ‰ฐแŒแ‰ แˆชแ‹ซแ‹Žแ‰ฝแŠ• แ‹จแˆ˜แŒˆแŠ•แ‰ฃแ‰ต แŠฅแŠ“ แ‹จแˆ›แˆฐแˆซแŒจแ‰ต แˆ‚แ‹ฐแ‰ต แˆ™แˆ‰ แ‰ แˆ™แˆ‰ แ‹ˆแ‹ฐ แŒ„แŠ•แŠชแŠ•แˆต แ‰ฐแ‹›แ‹แˆฏแˆ แฃ แŒˆแŠ•แ‰ขแ‹Žแ‰ฝ แŠจแˆ›แˆฝแŠ–แ‰ปแ‰ธแ‹ แˆ˜แˆแ‰€แ‰… แŠ แ‰†แˆ™ แŠฅแŠ“ แ‹จแˆ˜แˆแ‰€แ‰‚แ‹ซ แ‰กแ‹ตแŠ‘ แ‰ฅแ‰ป แ‹จแˆ˜แˆˆแ‰€แ‰… แˆ˜แ‰ฅแ‰ต แАแ‰ แˆจแ‹แข

แŠ แˆตแ‰€แ‹ตแˆ˜แŠ• แ‹จแˆแ‰ฐแŠ“แ‹Žแ‰ฝแŠ• แˆ˜แŒ€แˆ˜แˆญ แŠฅแŠ“ แ‹จแˆ›แ‹ญแŠ•แ‰€แˆณแ‰€แˆต แ‰ตแŠ•แ‰ณแŠ” แˆ›แˆปแˆปแˆ แŠฅแŠ•แˆแˆแŒ‹แˆˆแŠ•แฃ แŠฅแŠ“ แ‹จแŠฅแŠ› แˆตแŠญแˆชแ•แ‰ถแ‰ฝ แŠ แ‹ฐแŒ‰ แŠฅแŠ“ แŠ แ‹ฐแŒ‰แข แŠจแˆ˜แ‰ฐแŒแ‰ แˆชแ‹ซแ‹Žแ‰ปแ‰ฝแŠ• แŒ‹แˆญ แŠ แ‹ฐแŒˆ แŠฅแŠ“ แ‰ฐแˆˆแ‹แŒงแˆแข แ‰ แ‹šแ‹ซแŠ• แŒŠแ‹œ แ‹ˆแ‹ฐ 10 แ‹จแˆšแŒ แŒ‰ แˆ˜แ‰ฐแŒแ‰ แˆชแ‹ซแ‹Žแ‰ฝ แАแ‰ แˆฉ. แˆแˆˆแ‰ต แˆ˜แ‹ตแˆจแŠฎแ‰ฝ แŠฅแŠ•แ‹ณแˆ‰แŠ• แŒแˆแ‰ต แ‹แˆตแŒฅ แ‰ แˆ›แˆตแŒˆแ‰ฃแ‰ต 20 แ‹ซแˆ…แˆ "แˆ•แ‹ซแ‹" แˆตแŠญแˆชแ•แ‰ถแ‰ฝ แŠ“แ‰ธแ‹.

แ‹ˆแ‹ฐ แˆตแŠญแˆชแ•แ‰ฑ แŠ แ‹ฒแˆต แ‹ฐแˆจแŒƒ แˆˆแˆ˜แŒจแˆ˜แˆญ แ‰ แˆแˆˆแŒแŠ• แ‰แŒฅแˆญ แ‰แˆญแŒฅแˆซแŒฎแ‰นแŠ• แ‹ˆแ‹ฐ แˆแˆ‰แˆ แ‹จแˆผแˆ แˆตแŠญแˆชแ•แ‰ถแ‰ฝ แˆ˜แ‰…แ‹ณแ‰ต แАแ‰ แˆจแ‰ฅแŠ•แข แˆแŠ“แˆแ‰ฃแ‰ต แ‹จแ‰ แˆˆแŒ  แ‰ แŒฅแŠ•แ‰ƒแ‰„ แˆแŠ•แˆฐแˆซ แŠฅแŠ•แ‰ฝแˆ แАแ‰ แˆญแฃ แАแŒˆแˆญ แŒแŠ• แ‰ฅแ‹™ แŒŠแ‹œ แŠฅแŠ•แ‹ฐแ‹šแˆ… แŠ แ‹ญแАแ‰ต แˆˆแ‹แŒฆแ‰ฝ แ‰ แŠ แŒปแŒปแ แˆตแˆแ‰ต แŠ แ‰ฅแ‰…แ‰ฐแ‹‹แˆแฃ แ‹ญแˆ…แˆ แˆˆแ‰ฐแˆˆแ‰€แ‰€แ‹ แ‰กแ‹ตแŠ• แˆตแŠญแˆชแ•แ‰ถแ‰ฝแŠ• แˆˆแˆ›แˆตแ‰ฐแŠซแŠจแˆ แŠฅแŠ“ แ‹จแ‰ตแŠ›แ‹ แ‰ฅแˆแˆ… แˆฐแ‹ แ‹ญแˆ…แŠ• แ‰ตแŠฅแ‹›แ‹ แŠฅแŠ•แ‹ฐแŒจแˆ˜แˆจ แŠฅแŠ“ แˆแŠ• แŠฅแŠ•แ‹ฐแˆšแˆฐแˆซ แˆˆแˆ›แ‹ˆแ‰… แ‹ˆแ‹ฐ แˆแˆฝแ‰ต แ‰ฐแˆˆแ‹ˆแŒ แข แ‰ แŠ แŒ แ‰ƒแˆ‹แ‹ญ แˆˆแŠ แŠ•แ‹ต แˆ˜แ‹ตแˆจแŠญ แ‹จแˆ˜แˆฐแ‰ฅแˆฐแ‰ขแ‹ซ แˆตแŠญแˆชแ•แ‰ถแ‰ฝ แ‰ขแ‹ซแŠ•แˆต แ‰ แ‰ฐแ‹ˆแˆฐแА แˆ˜แˆแŠฉ แ‰ฐแˆ˜แˆณแˆณแ‹ญ แАแ‰ แˆฉ แˆ›แˆˆแ‰ต แŠ แ‹ญแ‰ปแˆแˆแข แˆแŠ•แˆ แŠฅแŠ•แŠณแŠ• แ‰ แŠฅแˆญแŒแŒ แŠแАแ‰ต แ‰ฐแˆ˜แˆณแˆณแ‹ญ แАแŒˆแˆญ แ‰ขแ‹ซแ‹ฐแˆญแŒ‰แˆ.

แˆˆแŠ แ‹ฒแˆต แŠ แ•แˆŠแŠฌแˆฝแŠ• แˆ‚แ‹ฐแ‰ต แˆˆแˆ˜แŒ€แˆ˜แˆญ แ‹จแŠฅแАแ‹šแˆ…แŠ• แˆตแŠญแˆชแ•แ‰ถแ‰ฝ โ€œแ‰ตแŠฉแˆตโ€ แˆตแˆชแ‰ต แˆˆแˆ˜แˆแˆจแŒฅ แŠ แŠ•แ‹ต แ‰€แŠ• แˆ›แˆณแˆˆแแฃ แˆ›แˆจแˆ แŠฅแŠ“ โ€œแŠ แ‹Ž แ‹ญแˆฐแˆซแˆโ€ แˆ›แˆˆแ‰ต แŠ แˆตแˆแˆ‹แŒŠ แАแ‰ แˆญแข

แŠฅ.แŠค.แŠ . แ‰ 2018 แ‹จแ‰ แŒ‹ แ‹ˆแ‰…แ‰ตแฃ แŠ แˆแŠ•แˆ แ‰ แˆ›แ‹ฐแŒ แˆ‹แ‹ญ แ‹ˆแ‹ณแˆˆแ‹ แ‹จแ‹แˆตแ‰ตแˆŒแŠ• แŠ แ‰…แŒฃแŒซ แŠฅแŠ•แ‹ฐแŒˆแŠ“ แ‰ฐแˆ˜แˆˆแŠจแ‰ตแŠ•แข

แ‰ฐแŒแ‰ฃแˆญ #1แก แˆแˆ‰แŠ•แˆ แ‹จแˆตแŠญแˆชแ•แ‰ต แ‹ฐแˆจแŒƒแ‹Žแ‰ฝ แŒ แ‰…แˆˆแˆ แŠ แ‹ตแˆญแŒˆแˆ… แ‰  Fastfile แ‹แˆตแŒฅ แƒแ‹แ‰ธแ‹

แˆตแŠ•แŒ€แˆแˆญแฃ แ‹จแŠฅแŠ› แˆตแŠญแˆชแ•แ‰ถแ‰ฝ แ‰ แŒ„แŠ•แŠชแŠ•แˆต แ‹แˆตแŒฅ แ‰ แŠ แŠ•แ‹ต แ‹จแˆผแˆ แˆตแŠญแˆชแ•แ‰ต แ‹แˆตแŒฅ แ‹ซแˆ‰แ‰ตแŠ• แˆแˆ‰แŠ•แˆ แ‹ฐแˆจแŒƒแ‹Žแ‰ฝ แŠฅแŠ“ แŠญแˆซแŠ•แ‰ฝ แ‹ซแ‰€แˆ แ‹จแŠฅแŒแˆญ แˆแ‰ฅแˆต แ‹ญแˆ˜แˆตแˆ‰ แАแ‰ แˆญแข แŠฅแˆตแŠซแˆแŠ• แ‹ˆแ‹ฐ แ‰งแŠ•แ‰ง แˆ˜แˆตแˆ˜แˆญ แŠฅแŠ“ แ‰ แ‹ฐแˆจแŒƒ แŠญแแแˆ แŠ แˆแ‰€แ‹จแˆญแŠ•แˆแข

แ‹ซแˆˆแŠ•แŠ• แ‰ฐแˆ˜แˆแŠญแ‰ฐแŠ“แˆ แŠฅแŠ“ แŠจแˆฒแŠ แ‹ญแŠค/แˆฒแ‹ฒ แˆ˜แŒแˆˆแŒซ แŒ‹แˆญ แ‹จแˆšแˆตแˆ›แˆ™ 4 แ‹ฐแˆจแŒƒแ‹Žแ‰ฝแŠ• แˆˆแ‹ญแ‰ฐแŠ“แˆแข

  • แˆ˜แŒˆแŠ•แ‰ฃแ‰ต - แŒฅแŒˆแŠ›แ‹Žแ‰ฝแŠ• แˆ˜แŒซแŠ•, แˆ›แˆ…แ‹ฐแˆฉแŠ• แˆ˜แˆฐแ‰ฅแˆฐแ‰ฅ,
  • แˆ™แŠจแˆซ - แ‹จแŒˆแŠ•แ‰ข แŠญแแˆ แˆ™แŠจแˆซแ‹Žแ‰ฝแŠ• แˆ›แŠซแˆ„แ‹ต แฃ แˆฝแ‹แŠ•แŠ• แˆ›แˆตแˆ‹แ‰ต แฃ
  • sonar - แˆแˆ‰แŠ•แˆ แˆŠแŠ•แ‰ฐแˆฎแ‰ฝแŠ• แ‹ซแˆตแАแˆณ แŠฅแŠ“ แˆชแ–แˆญแ‰ถแ‰ฝแŠ• แ‹ˆแ‹ฐ SonarQube แ‹ญแˆแŠซแˆ แฃ
  • แˆ›แˆฐแˆ›แˆซแ‰ต - แ‰…แˆญแˆต แ‹ˆแ‹ฐ แŠ แˆแ‹ (แ‹จแˆ™แŠจแˆซ แ‰ แˆจแˆซ) แˆ˜แˆ‹แŠญแข

แŠฅแŠ“ แ‰ แ‹ตแˆญแŒŠแ‰ต แ‹แˆตแŒฅ แŒฅแ‰…แˆ แˆ‹แ‹ญ แ‹จแ‹‹แˆ‰แ‰ตแŠ• แ‰แˆแŽแ‰ฝ แ‰ แˆ˜แ‰ฐแ‹ แ‹ˆแ‹ฐ แ‹แˆญแ‹แˆฎแ‰ฝ แŠซแˆแŒˆแ‰ฃแˆ… แ‹ญแˆ…แŠ• แˆแŒฃแŠ• แ‹แ‹ญแˆ แ‰ณแŒˆแŠ›แˆˆแˆ…แก-

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: "appleId@example.com",
  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แก แˆˆแŠคแŠ• แˆ˜แ‰ฐแŒแ‰ แˆชแ‹ซแ‹Žแ‰ฝ แŠ แŠ•แ‹ต แАแŒ แˆ‹ แˆแŒฃแŠ• แ‹แ‹ญแˆ แ‹ซแŒแŠ™

แŠ แˆแŠ• แ‰ฝแŒแˆฉแŠ• แˆ˜แแ‰ณแ‰ต แ‰ แŒฃแˆ แŠจแ‰ฃแ‹ต แŠ แ‹ญแ‹ฐแˆˆแˆ - แ‰ฐแˆˆแ‹‹แ‹‹แŒฎแ‰ฝแŠ• แ‹ซแ‹˜แŒ‹แŒ แŠฅแŠ“ แŠฅแŠ•แˆ‚แ‹ต แข แŠ แ‹Ž, แ‰ แŠฅแ‹แАแ‰ฑ, แ‰ฝแŒแˆฉ แ‹จแ‰ฐแˆแ‰ณแ‹ แ‰ แ‹šแˆ… แˆ˜แŠ•แŒˆแ‹ต แАแ‹. แАแŒˆแˆญ แŒแŠ• แ‰ฃแАแˆณแŠ•แ‰ แ‰ต แˆฐแŠ แ‰ต แ‰ แˆซแˆฑ แ‰ แ‹แˆตแ‰ตแˆ‹แ‹ญแŠ• แ‹ˆแ‹ญแˆ แ‹แˆตแ‰ตแˆ‹แŠ• แ‰ แˆšแƒแแ‰ แ‰ต แ‰ แˆฉแ‰ข แ‹แˆตแŒฅแˆ แˆ†แА แ‰ แŠ”แ‰ตแ‹ˆแˆญแŠฉ แˆ‹แ‹ญ แŒ แ‰ƒแˆš แˆแˆณแˆŒแ‹Žแ‰ฝ แ‹จแˆˆแŠ•แˆแข แŠ แŠ•แ‹ต แŒˆแŠ•แ‰ข.

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
APPLE_ID=appleID@example.com
TEAM_ID=ABCD1234
FASTLANE_ITC_TEAM_ID=123456789

แŠ แˆแŠ•แฃ แŠฅแАแ‹šแˆ…แŠ• แ‰แˆแŽแ‰ฝ แ‰  fastlane แ‹แ‹ญแˆŽแ‰ฝ แ‹แˆตแŒฅ แˆ˜แŒ แ‰€แˆ แˆˆแˆ˜แŒ€แˆ˜แˆญแฃ แŠฅแŠ•แ‹ดแ‰ต แŠฅแ‹šแ‹ซ แˆ›แ‹ตแˆจแˆต แŠฅแŠ•แ‹ณแˆˆแ‰ฅแŠ• แˆ›แ‹ˆแ‰… แАแ‰ แˆจแ‰ฅแŠ•แข Fastlane แˆˆแ‹šแˆ… แˆ˜แแ‰ตแˆ” แŠ แˆˆแ‹แก- แ‰  dotenv แ‰ แŠฉแˆ แ‰ฐแˆˆแ‹‹แ‹‹แŒฎแ‰ฝแŠ• แˆ˜แŒซแŠ•. แˆฐแАแ‹ฑ แˆˆแ‰ฐแˆˆแ‹ซแ‹ฉ แ‹“แˆ‹แˆ›แ‹Žแ‰ฝ แ‰แˆแŽแ‰ฝแŠ• แˆ˜แŒซแŠ• แˆˆแŠฅแˆญแˆตแ‹Ž แŠ แˆตแˆแˆ‹แŒŠ แŠจแˆ†แА แ‰  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 git@repository.com/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.

แ‹จแ‰ฐแˆˆแ‰€แ‰€แ‹ แ‰กแ‹ตแŠ• แŠ แ‹ฒแˆต แŠฅแˆญแˆแŒƒ แˆˆแˆ˜แŒจแˆ˜แˆญ แˆฒแˆแˆแŒ แ‰ แˆตแŠญแˆชแ•แ‰ฑ แˆ‹แ‹ญ แ‹จแ‰ฐแ‹ฐแˆจแŒ‰ แˆˆแ‹แŒฆแ‰ฝ แ‰  MR in git แ‰ แŠฉแˆ แ‹ญแˆ˜แ‹˜แŒˆแ‰ฃแˆ‰ แฃแ‹จแ‰ฐแ‰ แˆ‹แˆน แˆตแŠญแˆชแ•แ‰ถแ‰ฝแŠ• แ‹ˆแŠ•แŒ€แˆˆแŠžแ‰ฝ แˆ˜แˆแˆˆแŒ แŠ แ‹ซแˆตแˆแˆแŒแˆ แฃ แŠฅแŠ“ แ‰ แŠ แŒ แ‰ƒแˆ‹แ‹ญ แฃ แŠ แˆแŠ• แŠฅแˆฑแŠ• แˆˆแˆ˜แˆตแ‰ แˆญ แˆ˜แˆžแŠจแˆญ แŠ แˆˆแ‰ฅแ‹Žแ‰ตแข

แŠ แˆแŠ• แ‹ซ แŠฅแˆญแŒแŒ แŠ› แАแ‹แข

แŠจแ‹šแˆ… แ‰€แ‹ฐแˆ แˆแˆ‰แŠ•แˆ แˆตแŠญแˆชแ•แ‰ถแ‰ฝ แ‰ แˆ˜แŒ แ‰ แ‰…แฃ แ‰ แˆ›แ‹˜แˆ˜แŠ• แŠฅแŠ“ แˆแˆ‰แŠ•แˆ แ‹จแ‹แˆ›แŠ”แ‹Žแ‰ฝ แˆ˜แ‹˜แ‹ แˆˆแˆ›แˆตแ‰ฐแŠซแŠจแˆ แŒŠแ‹œ แŠ แˆณแˆแˆแŠ“แˆแข แ‹จแˆตแˆ…แ‰ฐแ‰ถแ‰ฝ แŠฅแŠ“ แ‹จแˆ˜แˆแ‰€แ‰‚แ‹ซ แŒŠแ‹œแ‹Žแ‰ฝ แˆแŠญแŠ•แ‹ซแ‰ถแ‰ฝ แ‰ แˆผแˆ แˆตแŠญแˆชแ•แ‰ถแ‰ฝ แ‹แˆตแŒฅ แˆˆแˆ˜แŠจแ‰ณแ‰ฐแˆ แ‰ แŒฃแˆ แŠ แˆตแ‰ธแŒ‹แˆช แ‹จแˆ†แŠ‘ แ‰€แˆ‹แˆ แ‹จแŠแ‹ฐแˆ แˆตแˆ…แ‰ฐแ‰ถแ‰ฝ แˆฒแˆ†แŠ‘ แ‰ แŒฃแˆ แ‰ฐแˆตแ‹ แŠ แˆตแ‰†แˆซแŒญ แАแ‰ แˆญแข แŠ แˆแŠ• แŠฅแŠ•แ‹ฐแ‹šแˆ… แ‹ซแˆ‰ แˆตแˆ…แ‰ฐแ‰ถแ‰ฝ แ‰ แ‰ตแŠ•แˆน แ‹ญแ‰€แŠ•แˆณแˆ‰. แˆˆแ‹แŒฆแ‰ฝ แ‰ แŠ แŠ•แ‹ต แŒŠแ‹œ แˆˆแˆแˆ‰แˆ แˆ˜แ‰ฐแŒแ‰ แˆชแ‹ซแ‹Žแ‰ฝ แ‹ญแˆˆแ‰€แ‰ƒแˆ‰แข แŠฅแŠ“ แ‰ แˆ‚แ‹ฐแ‰ฑ แ‹แˆตแŒฅ แŠ แ‹ฒแˆต แˆ˜แ‰ฐแŒแ‰ แˆชแ‹ซแŠ• แˆˆแˆ›แˆตแŒˆแ‰ฃแ‰ต 15 แ‹ฐแ‰‚แ‰ƒแ‹Žแ‰ฝแŠ• แ‹ญแ‹ˆแˆตแ‹ณแˆ - แ‹จแŠ แ‰ฅแАแ‰ต แ‰งแŠ•แ‰ง แˆ˜แˆตแˆ˜แˆญ แ‰  CI แˆ‹แ‹ญ แ‹ซแ‹˜แŒ‹แŒ แŠฅแŠ“ แ‰แˆแŽแ‰ฝแŠ• แ‹ˆแ‹ฐ แŒˆแŠ•แ‰ขแ‹ แˆ›แŠจแˆ›แ‰ป แ‹ซแŠญแˆ‰แข

แ‹จFastfile แАแŒฅแ‰ฅ แŠฅแˆตแŠซแˆแŠ• แ‹ซแˆแ‰ฐแ‰ฅแˆซแˆซ แ‹ญแˆ˜แˆตแˆ‹แˆแข Android แŠฅแŠ“ แ‹จแŠ แ•แˆŠแŠฌแˆฝแŠ–แ‰น แŠแˆญแˆ›แข แŒฝแˆ‘แ‰ แŠ แˆตแ‹ฐแˆณแ‰ฝ แŠจแˆ†แАแฃ แ‰ฐแŠจแ‰ณแ‹ญ แŒฝแˆ‘แ แŠฅแŒฝแ‹แˆˆแˆแข แ‹ญแˆ…แŠ•แŠ• แ‰ฝแŒแˆญ แŠฅแŠ•แ‹ดแ‰ต แŠฅแŠ•แ‹ฐแˆšแˆแ‰ฑ แŒฅแ‹ซแ‰„แ‹Žแ‰ฝแ‹ŽแŠ• แ‹ˆแ‹ญแˆ แŠ แˆตแ‰ฐแ‹ซแ‹จแ‰ถแ‰ฝแ‹ŽแŠ• แ‰ แŠ แˆตแ‰ฐแ‹ซแ‹จแ‰ถแ‰ฝ แ‹ˆแ‹ญแˆ แ‰ แ‰ดแˆŒแŒแˆซแˆ แˆ‹แ‹ญ แˆ˜แˆตแˆ›แ‰ต แŠฅแˆแˆแŒ‹แˆˆแˆแข แ‰ฃแˆฝแŠชแˆฎแ‰ซ.

แˆแŠ•แŒญ: hab.com

แ‰ DDoS แŒฅแ‰ แ‰ƒแฃ VPS VDS แŠ แŒˆแˆแŒ‹แ‹ฎแ‰ฝ แˆˆแŒฃแ‰ขแ‹ซแ‹Žแ‰ฝ แŠ แˆตแ‰ฐแˆ›แˆ›แŠ แˆ›แˆตแ‰ฐแŠ“แŒˆแŒƒ แ‹ญแŒแ‹™ ๐Ÿ”ฅ แŠ แˆตแ‰ฐแˆ›แˆ›แŠ แ‹จแ‹ตแˆญ แŒฃแ‰ขแ‹ซ แˆ›แˆตแ‰ฐแŠ“แŒˆแŒƒ แ‰ แ‹ฒแ‹ถแŠคแˆต แŒฅแ‰ แ‰ƒแฃ แ‰ แ‰ชแ’แŠคแˆต แ‰ชแ‹ฒแŠคแˆต แŠ แŒˆแˆแŒ‹แ‹ฎแ‰ฝ แ‹ญแŒแ‹™ | ProHoster