ãã®èšäºã§ã¯ãmacOSã䜿çšãããã€ãã£ããã«ãã§Gitlabãä»ããŠAndroidããã³iOSã§Unityãããžã§ã¯ãããã«ãããæ¹æ³ã«ã€ããŠèª¬æããŸãã
ç§ã¯å°ããªã²ãŒã éçºäŒç€Ÿã§åããŠããŸãããæ¬¡ã®åé¡ãåå ã§ã¢ã»ã³ããªãèªååããã¿ã¹ã¯ãçŸããŸããã
- 5ã€ã®åæ£ããŒã ã¯ãäžçäžã®ã©ãããã§ããããžã§ã¯ããåéããå¿
èŠããããŸã
- ç°ãªããŠãããããŒãžã§ã³ããµããŒãããå¿
èŠããããŸã
- ã¢ã»ã³ãã©ãŒã¯åããŒã ããå°ãªããšãé±ã«5ã€ã®ã¢ã»ã³ããªãæäŸããå¿
èŠããããŸã
- èšŒææžã¯éçºè
ã§ã¯ãªãäžå€®ã«ä¿åããå¿
èŠããããŸã
- åéããããã«ãã¯ãäžçäžã®ã©ãããã§ãåç
§ã«ããã¢ã¯ã»ã¹å¯èœã§ãªããã°ãªããŸãã
- ãããžã§ã¯ãã§å¿
èŠãªã©ã€ãã©ãªã®ååšã確èªããå¿
èŠããããŸãïŒåºåSDKãšã³ãŒããããŒã«ãªãŒãŒã·ã§ã³ãä¿åïŒ
- ã³ãã³ãã®ã¢ã»ã³ããªæ§æã¯1ãæã§è¡ãå¿
èŠããããŸã
ãããã®åé¡ã解決ããããã«ãUnity Cloud BuildãTeamCityãJenkinsãGitlab CIãBitbucket Pipelinesãªã©ã®æ¢è£œã®ãœãªã¥ãŒã·ã§ã³ãæ¢ã«äœæãããŠããŸãã
æåã®ãã®ã¯ãUnityãããžã§ã¯ãã®ã¢ã»ã³ããªçšã«æºåãããŠããŸãããèšŒææžã䜿çšããäœæ¥ã®èªååã¯èš±å¯ãããŠãããããããžã§ã¯ãããšã«æåã§å
¥åããå¿
èŠããããŸãã TeamCityãšJenkinsã§ã¯ã管çé åã§ãããžã§ã¯ããèšå®ãïŒããã«ããéçºè
ã®æ§æãå°ãè€éã«ãªããŸãïŒãå¥ã®ãµãŒããŒã«è¿œå ã®ãœãããŠã§ã¢ãã€ã³ã¹ããŒã«ãããã®ãµããŒããè¡ãå¿
èŠããããŸãã ãã®çµæãGitlabãšBitbucketã®2ã€ã®ãªãã·ã§ã³ãå®è£
ããã®ãæãç°¡åã§æéã§ããã
åé¡ã解決ããæç¹ã§ã¯ãBitbucket Pipelinesã¯ãŸã çºè¡šãããŠããªãã£ããããGitlabã䜿çšããããšã決å®ãããŸããã
ãã®ã¢ãããŒããå®è£
ããããã«ãæ¬¡ã®æé ãå®è¡ãããŸããã
- ãããžã§ã¯ãã®ã»ããã¢ãã
- ã©ã³ããŒèšå®
- ãã«ãã¹ã¯ãªããã®äœæ
1.ãããžã§ã¯ãã®ã»ããã¢ãã
ã³ã¬ã¯ã¿ãŒã§åéããããããžã§ã¯ãã¯ãGitlabã«ä¿åãããŸãã ãµãŒãã¹ã®ç¡æçã¯ããªããžããªèªäœãšãã®æ°ãå¶éããŸããã
åãããžã§ã¯ãã«ã¯ããããŒã§å®è¡ãããã©ã³ããŒïŒgitlabãµãŒããŒããã³ãã³ããå®è¡ãããµãŒãã¹ïŒãå«ãŸããŠããŸãã
ã³ã¬ã¯ã¿ãŒã®æ§æã¯ã.gitlab-ci.ymlãã¡ã€ã«ãšããŠãããžã§ã¯ãã®ã«ãŒãã«ãããŸãã ã¢ããªã±ãŒã·ã§ã³IDãå¿
èŠãªçœ²åIDïŒAndroidã®ããŒã¹ãã¢ãšiOSã®ã¢ã«ãŠã³ãåïŒãå¿
èŠãªUnityããŒãžã§ã³ããã©ã³ããèµ·åã¢ãŒãïŒæåãŸãã¯èªåãããã³ã¢ã»ã³ããªãéå§ããã³ãã³ãïŒå¿
èŠã«å¿ããŠãgitlabã¯ããå€ãã®ãã©ã¡ãŒã¿ãŒã ããã¥ã¡ã³ãããµããŒãïŒ ã«ã€ããŠèª¬æããŸã ã
ãµã³ãã«.gitlab-ci.ymlæ§æãã¡ã€ã«variables: BUNDLE: com.banana4apps.evolution SIGNING: banana4apps UNITY_VERSION: 2017.1 build:android: script: - buildAndroid.sh $BUNDLE $SIGNING $UNITY_VERSION only: - releaseAndroid when: manual build:ios: script: - buildIOS.sh $BUNDLE $SIGNING $UNITY_VERSION only: - releaseIOS when: manual
2.ã©ã³ããŒã®ã»ããã¢ãã
Gitlab CIã¯ãå
±æã©ã³ããŒãšç¬èªã®ã©ã³ããŒã§åäœããŸã ïŒ ããã¥ã¡ã³ã ïŒã ç¡æçã§ã¯ãå
±æã©ã³ããŒã®äœ¿çšæéã«å¶éããããŸãããç¬èªã®ã©ã³ããŒãç¡å¶éã«äœ¿çšã§ããŸãã å
±æã©ã³ããŒã¯Linuxäžã§å®è¡ããããããiOSã¢ããªã±ãŒã·ã§ã³ããããã§ã¢ã»ã³ãã«ããããšã¯ã§ããŸããïŒãã ããUnityã¯æåããŸããããã«é¢ããèšäºããããŸããïŒã ãã®ãããç§ã¯èªåã®ãããŒã§ã©ã³ããŒãäžããå¿
èŠããããŸããã äžèšã®äŸã§ã¯ãã©ã³ããŒã¯buildAndroid.shãŸãã¯buildIOS.shã¹ã¯ãªããïŒãã©ã³ãã«ãã£ãŠç°ãªãïŒãå®è¡ããŸããããã¯ãæºåæé ãUnityã®èµ·åããã«ãçµæã®éç¥ãèšè¿°ããŠããŸãã
ã©ã³ããŒã®èšå®ããã»ã¹ã¯ããã¥ã¡ã³ãã«gitlab-runner install
説æãããŠããã gitlab-runner install
ããã³gitlab-runner start
ãŸãã
ãã®åŸãå¿
èŠãªUnityããŒãžã§ã³ããããŒã«ã€ã³ã¹ããŒã«ãããŸãã
3.ãã«ãã¹ã¯ãªããã®äœæ
ãã©ãããã©ãŒã ããšã«ããã«ãããã»ã¹ã®éãã«ãããç¬èªã®ã¹ã¯ãªãããäœæããå¿
èŠããããŸããã ãã ããã¢ã«ãŽãªãºã ã¯åãã§ãã
- ãããžã§ã¯ãIDã®æ£ç¢ºæ§ãç®çã®çœ²åIDã®èšŒææžã®å¯çšæ§ã確èªããŸã
- SDKãJavaãžã®ãã¹ãå®çŸ©ãã
- ã¢ã»ã³ããªãéå§ããã¡ãœããã䜿çšããŠCïŒãããžã§ã¯ãã«ã¯ã©ã¹ãäœæããŸã
- Unityã®å¿
èŠãªããŒãžã§ã³ã®å¯çšæ§ã確èªããã¢ã»ã³ããªãå®è¡ããŸãã ããã§ãªãå Žåã¯ãããã©ã«ãããŒãžã§ã³ã§ãã«ãããŠã¿ãŠãã ãã
- apkãŸãã¯Xcodeãããžã§ã¯ãã®å¯çšæ§ã確èªããååšããªãå Žåã¯Slackã§ãšã©ãŒãéç¥ããŸã
- iOSã®å ŽåïŒXcodeãããžã§ã¯ãã®æ§ç¯
- ã¢ãŒãã£ãã¡ã¯ãïŒapkãipaïŒããµãŒããŒïŒAmazon S3ãªã©ïŒã«ã¢ããããŒãããŸã
- Slackã§ãã«ããæåããããšãéç¥ããã¢ãŒãã£ãã¡ã¯ããããŠã³ããŒãããããã®ãªã³ã¯ãéä¿¡ããŸã
Unityãããžã§ã¯ãããã«ãããç¹æ§ã¯ãUnityããããã¢ãŒãã§äœ¿çšãããšããããžã§ã¯ãã§äœ¿çšå¯èœãªã¯ã©ã¹ã®éçã¡ãœããã®ã¿ãå®è¡ã§ããããšã§ãã ãããã£ãŠãã¢ã»ã³ããªã¹ã¯ãªããã¯ãã¢ã»ã³ããªãéå§ããããã®ã¡ãœãããå«ãã¯ã©ã¹ããããžã§ã¯ãã«ãã¹ããŒãããŸãã
CustomBuild.cs public class CustomBuild { static string outputProjectsFolder = Environment.GetEnvironmentVariable("OutputDirectory"); static string xcodeProjectsFolder = Environment.GetEnvironmentVariable("XcodeDirectory"); static void BuildAndroid() { BuildTarget target = BuildTarget.Android; EditorUserBuildSettings.SwitchActiveBuildTarget(target); PlayerSettings.applicationIdentifier = Environment.GetEnvironmentVariable("AppBundle"); PlayerSettings.Android.keystoreName = Environment.GetEnvironmentVariable("KeystoreName"); PlayerSettings.Android.keystorePass = Environment.GetEnvironmentVariable("KeystorePassword"); PlayerSettings.Android.keyaliasName = Environment.GetEnvironmentVariable("KeyAlias"); PlayerSettings.Android.keyaliasPass = Environment.GetEnvironmentVariable("KeyPassword"); BuildPipeline.BuildPlayer(GetScenes(), string.Format("{0}/{1}.apk" , outputProjectsFolder, PlayerSettings.applicationIdentifier), target, options); } static void BuildIOS() { BuildTarget target = BuildTarget.iOS; EditorUserBuildSettings.SwitchActiveBuildTarget(target); PlayerSettings.applicationIdentifier = Environment.GetEnvironmentVariable("AppBundle"); PlayerSettings.iOS.appleDeveloperTeamID = Environment.GetEnvironmentVariable("GymTeamId"); BuildPipeline.BuildPlayer(GetScenes(), xcodeProjectsFolder, target, options); }
Environment.GetEnvironmentVariableã¡ãœããã¯ãbashã¹ã¯ãªããã§ä»¥åã«æå®ãããç°å¢å€æ°ã®å€ãååŸããŸãã
Androidãã«ãã¹ã¯ãªããã®äŸ
buildAndroid.sh GREEN='\033[0;32m' RED='\033[0;33m' NC='\033[0m'
iOSçšã®ãµã³ãã«ãã«ãã¹ã¯ãªãã
ãããžã§ã¯ãã®ã¢ã»ã³ããªã¯ãUnityããã®Xcodeãããžã§ã¯ãã®åœ¢æãšXcodeãããžã§ã¯ãã®ã¢ã»ã³ããªãšãã2ã€ã®ã¹ãããã§å®è¡ãããŸãã éçºè
ã¯Xcodeãããžã§ã¯ãã«çŽæ¥åœ±é¿ãäžããããšã¯ã§ããŸãããããã¯å¶éããããããŸãããããžã§ã¯ãèšå®ãã¢ã»ã³ããªæ
å ±ãçŽæ¥å€æŽããããšã¯ã§ããŸããã
ãŸããiOSã®ãã«ãæ©èœã§ã¯ããã¹ãããã€ã¹ãã¢ããªã±ãŒã·ã§ã³ã®ããããžã§ãã³ã°ãããã¡ã€ã«ã«ç»é²ããå¿
èŠããããŸãã Xcodeãããžã§ã¯ãããã«ãããã«ã¯ããã«ãããåã«Appleã®éçºè
ã³ã³ãœãŒã«ã§èšŒææžãããããžã§ãã³ã°ãããã¡ã€ã«ãããã³ã¢ããªã±ãŒã·ã§ã³IDãäœæããå¿
èŠããããŸãã
Fastlaneã¯ããã®ããã»ã¹ãèªååããããã«äœ¿çšãããŸãã ãã®ããŒã«ã¯ãèšŒææžãšãããã¡ã€ã«ãäœæããã³åæãããã«ããšã¡ã¿æ
å ±ãiTunes Connectã«ã¢ããããŒãã§ããããã«ããŸãã
Xcodeã«ã¢ã¯ã»ã¹ããã«Unityãããžã§ã¯ããæ§ç¯ããå Žåã埮åŠãªéãããããŸãã
- Unityã§ã¯ããããžã§ã¯ãããã«ãããåã«ãéçºè
ã®ã³ââã³ãœãŒã«ã«ããTeamIdãæå®ããå¿
èŠããããŸã-ããã¯PlayerSettings.iOS.appleDeveloperTeamIDãä»ããŠè¡ãããŸã
- åŸåŠçãããžã§ã¯ãã¹ã¯ãªããã§ã¯ãXcodeãããžã§ã¯ããååŠçããå¿
èŠããããŸããinfo.plistãæ§æããèšå®ããã«ãããŸã
ãªãªãŒã¹ãšã¢ãããã¯ãã«ãã«ã¯ãçµæã®åœ¢æãç°ãªãã¹ã¯ãªããããããŸãããªãªãŒã¹ã¯ãiTunes Connectã§ã¢ãŒã«ã€ããããŠã³ããŒãããIPAãã¢ãããã¯ããŠã³ããŒããããããã§ã¹ããšããŠã³ããŒãããŒãžãç¡ç·ã§äœæãããã¹ãŠã®é¢ä¿è
ã«ãªã³ã¯ãéä¿¡ãããŸãã
ã¢ãããã¯ãã«ãïŒbuildAdhocIOS.sh GREEN='\033[0;32m' RED='\033[0;33m' NC='\033[0m'
ãªãªãŒã¹ãã«ãïŒbuildIOS.sh GREEN='\033[0;32m' RED='\033[0;33m' NC='\033[0m'
ä»ã®äººããã®ã·ã¹ãã ã§ã©ã®ããã«åãã
- éçºè
ã¯ããã³ãã¬ãŒããã¡ã€ã«.gitlab-ci.ymlããããžã§ã¯ãã«ãŒãã«è¿œå ããgitlab.comã®ãããžã§ã¯ãèšå®ã«ã©ã³ããŒãå«ããã³ãŒããç®çã®ãã©ã³ãã«ããã·ã¥ããŸãã
- ã²ãŒã ãã¶ã€ããŒãšãã¹ã¿ãŒã¯ãã¢ã»ã³ããªã®æåã«é¢ããéç¥ãšãSlackã§apkããã³ipaã¢ãŒã«ã€ããããŠã³ããŒãããããã®ãªã³ã¯ãåãåããŸãã
- ç§ã¯ãã«ãã远跡ãããã°ã確èªããéçºè
ããã°ã«å¯ŸåŠããã®ãå©ããããšãã§ããŸãã ãã°ãšå®è¡äžã®ãã«ãã¯ãgitlabã§çŽæ¥ç¢ºèªã§ããŸãã ãã€ãã¹ã®-ä»ãã€ã³ã¿ãŒãã§ã€ã¹ã§ã¯ãç¹å®ã®ã©ã³ããŒã®ãã«ããã¥ãŒãèŠãããšãã§ããŸããã
ãã«ããã°ã衚瀺ããããã®ã€ã³ã¿ãŒãã§ã€ã¹ïŒ

çµæ
ãããã£ãŠãçµæã®ã·ã¹ãã ã¯äœ¿ããããããµãŒããŒåŽãããã§ãã¯ãšæ€èšŒã远å ã§ããŸãïŒã³ãŒãã¹ã¿ã€ã«ããã¹ãïŒããããŒãžã£ãŒã¯Slackã®ã¢ã»ã³ããªãžã®ãªã³ã¯ã衚瀺ããiOSã®ã¢ã»ã³ããªã«åé¡ã¯ãããŸããã
ãã€ãã¹-ãã®ãµããŒãã¯ãUnityã®æ°ããããŒãžã§ã³ã远å ããIDã«çœ²åããã±ã·ã®å¥åº·ã確ä¿ããããã«å¿
èŠã§ãã
çŸåšã2人ã®ã©ã³ããŒãåããŠããïŒçŽ2幎ïŒã4000ãè¶
ããã¢ã»ã³ããªãã·ã¹ãã ãééããŠããŸãã ãã«ãé床ã¯ãã©ã³ããŒã®ç¹æ§ãšãããžã§ã¯ãå
ã®ã¢ã»ããã®æ°ã«äŸåããŸãããããã¯æ¯åã€ã³ããŒããããAndroidã§ã¯3ã30åãiOSã§ã¯10ã60åã§å€åããããã§ãã