äŒç€Ÿã®ã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã®éçºãç£æ¥åºç€ã«åãæ¿ãããšãèªåã¢ã»ã³ããªã®åé¡ãå¿
ãæµ®äžããŸãã ç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ã¯ãããã»ã¹ã®äžå¯æ¬ ãªéšåã§ãã ãã®ããã»ã¹ã®çµæã¯ã顧客ããã³ãªã¢ãŒããã¹ã¿ãŒãžã®OTAé
ä¿¡ã®ããã«ãäŒç€Ÿã®ããã€ã¹ã§ãã¹ãããããã®ã¢ã»ã³ããªã§ãã
äŒç€Ÿã®ã¢ã«ãŠã³ããŸãã¯é¡§å®¢ã®ã¢ã«ãŠã³ãã§å
¬éããå Žåãå€æ°ã®ãããã¡ã€ã«ãšèšŒææžãããŒãããããã£ãèšå®ãåŠçããå¿
èŠããããŸãã ããã€ã¹ã®ç¹å®ã®ããŒã亀æããããšã¯å¿
ããã䟿å©ã§ã¯ãããŸããã ãã®ãããåœç€Ÿã§ã¯ããã®ããã»ã¹ãèªååãããœãªã¥ãŒã·ã§ã³ãèãåºããŸããã ãã®èšäºã§ã¯ãã¢ã»ã³ããªã«äœ¿çšããããã¹ãŠã®ããã€ã¹ã§ã®ã¢ãŒãã£ãã¡ã¯ãã®é
åžã®èªååã«ã€ããŠèª¬æããŸãã
ãããã£ãŠããã®èšäºã§ã¯ãç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ã®äžéšãšããŠãiOSã¢ã»ã³ããªãšããããã£ã®èšŒææžãšãããã¡ã€ã«ã®ã³ããŒãããã³ãã¹ãŠã®Jenkinsã¹ã¬ãŒãã®Androidã¢ã»ã³ããªã®ããŒã®ã³ããŒãå®è£
ããæ¹æ³ã«ã€ããŠèª¬æããŸãã ãã®ãããªèªååã¯æéãç¯çŽããééããé¿ããã®ã«åœ¹ç«ã¡ãŸãã ãã®èšäºã¯ãã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã®éçºè
ãšJenkinsã管çãã人ã
ã«ãšã£ãŠèå³æ·±ããã®ã§ãã
è¡ããïŒ
åé¡
æ°å¹ŽåãJenkinsïŒç¶ç¶ççµ±åãµãŒããŒïŒãæåã«ã»ããã¢ãããããšãããã¹ãŠã®ã¢ã»ã³ããªãå®è¡ããããã·ã³ïŒmak-miniïŒã1å°ãããããŸããã§ããã ãããŠããžã§ã³ãã³ã¹ã¯ä»®æ³ãã·ã³ã«ç§»è¡ããããã«ãŒã¯ã¹ã¬ãŒãïŒãããžã§ã¯ãã®æ§ç¯ã«äœ¿çšããããžã§ã³ãã³ã¹ã®è£å©ããŒãïŒã«å€ãããŸããã iOSãããžã§ã¯ãã¯Mac OSããã³Androidã§ã®ã¿ãã«ãã§ãããããiOSãããžã§ã¯ãã¯ã¹ã¬ãŒãã§ãã«ããããAndroidãããžã§ã¯ãã¯ãã¹ã¿ãŒïŒJenkinsèªèº«ãã€ã³ã¹ããŒã«ãããŠããïŒã§ãã«ããããŸããã ãããžã§ã¯ãããã«ãããããã«å¿
èŠãªãã®ã¯ãã¹ãŠæäœæ¥ã§2å°ã®ãã·ã³ã«ã€ã³ã¹ããŒã«ããã³ã¬ã€ã¢ãŠãããããã¹ãŠã倧äžå€«ã§ããïŒ ä»¥åã®èšäºã®1ã€ã§
ãJenkinsã䜿çšããŠXcodeã®ç°ãªãããŒãžã§ã³ã§iOSã¢ããªã±ãŒã·ã§ã³ãèªåçã«æ§ç¯ãããã§Jenkinsãæ§æããæ¹æ³ã«ã€ããŠèª¬æããŸããã
ãããžã§ã¯ãã®æ°ãå¢ããæåã«1ã€ã®ã³ã¬ã¯ã¿ãŒãiOSããã³Androidãããžã§ã¯ãã«æ¥ç¶ãããã®åŸããã«æ¥ç¶ããŸããã æ¥ç¶ãããã°ããã®ã¹ã¬ãŒãã§ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããã«ã¯ãã€ã³ã¹ããŒã«ãããããŒã«ãSDKãããã³ãããžã§ã¯ãããšã«ãã¢ããªã±ãŒã·ã§ã³ã眲åããããŒãšãã¡ã€ã«ãå¿
èŠã§ãã
Jenkinsã¹ã¬ãŒãã®èšå®ãæé©åããããšãã€ãŸããiOSããã³Androidã¢ããªã±ãŒã·ã§ã³ã®çœ²åã«å¿
èŠãªãã¡ã€ã«ãèªåçã«ã³ããŒããŠã€ã³ã¹ããŒã«ããããšã«ããŸããã
iOSããå§ããŸããã
iOSãããžã§ã¯ããæ§ç¯ããããã®Jenkinsã¹ã¬ãŒããããã€ããããŸãã ãã¹ãŠã®ã¹ã¬ãŒãã«ã¯ã©ãã«ãä»ããŠãããããã€ã³ã¹ããŒã«ãããŠããXcodeã®ããŒãžã§ã³ã確èªã§ããŸãã è² è·ãåæ£ããããã«ããã¹ãŠã®ã¢ã»ã³ããªã«ã¯ã©ãã«ãä»ããããŠããã察å¿ããXcodeãåããä»»æã®ã¹ã¬ãŒãã§å®è¡ã§ããŸãã
iOSã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããã«ã¯ã次ã®ãã®ãå¿
èŠã§ãã
- Xcode
- éçºè
/é
åžèšŒææž+ç§å¯ããŒ
- ããããžã§ãã³ã°ãããã¡ã€ã«
éåžžããžã§ã³ãã³ã§ã¯ãé
åžã¢ã»ã³ããªïŒAdHocãEnterpriseãAppStoreïŒãåéããŸãã ããããç§ãã¡ã¯ããããå€æ°ã®éçºè
ã¢ã«ãŠã³ãçšã«åéããå¿
èŠããããããŒä»ãã®èšŒææžããããããããŸãã
ããŒä»ãã®èšŒææžããªã¢ãŒããã·ã³ã«é
眮ããã«ã¯ã次ã®ãã®ãå¿
èŠã§ãã
- 蚌ææžãã€ã³ã¹ããŒã«ãããŠãããã·ã³äžã®ããŒã䜿çšããŠèšŒææžããšã¯ã¹ããŒããã
- .p12ãã¡ã€ã«ããªã¢ãŒããã·ã³ã«ã³ããŒãã
- ãªã¢ãŒããã·ã³ã«ç§»åããŠ.p12ãã¡ã€ã«ãéãããã¹ã¯ãŒããå
¥åããŠèšŒææžãšããŒãããŒãã§ãŒã³ã«ã€ã³ã¹ããŒã«ãã
- 蚌ææžãšããŒãã€ã³ã¹ããŒã«ããåŸãããŒæ
å ±ãéãããã¢ã¯ã»ã¹å¶åŸ¡ãã¿ãã§ããã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ã«ãã®ã¢ã€ãã ãžã®ã¢ã¯ã»ã¹ãèš±å¯ããããéžæããŸã
sshãä»ããŠåãããšãè¡ãã«ã¯ãsecurityã³ãã³ãã䜿çšããå¿
èŠããããŸãã
ãããã¡ã€ã«ãã€ã³ã¹ããŒã«ããã«ã¯ãç®çã®ãã£ã¬ã¯ããªã«ã³ããŒããã ãã§ãïŒã/ Library / MobileDevice / Provisioning \ Profiles /
ãã®å Žåãå€ããããã¡ã€ã«ãåé€ããããšãæãŸããã Xcodeããã«ããããšããæŽæ°ããããããã¡ã€ã«ã®ä»£ããã«å€ããããã¡ã€ã«ã䜿çšã§ããŸãã
éåžžããããã¡ã€ã«ã®ãªã¹ããæŽæ°ããã«ã¯ãXcodeèšå®ã«ç§»åããå¿
èŠãªã¢ã«ãŠã³ããéžæããåŸã[åèªã¿èŸŒã¿]ãã¿ã³ãã¯ãªãã¯ããŸãã Xcodeèªäœã¯ãããŒã¿ã«ã§ç·šéãããŠããå Žåãå€ããããã¡ã€ã«ãæ°ãããããã¡ã€ã«ã«çœ®ãæããŸãã ãããããã¹ãŠã®ã¢ã«ãŠã³ãã®è€æ°ã®ãã·ã³ã§ãããè¡ãã®ã¯å¹æçã§ã¯ãªããäžè¬çã«æ鬱ã§ãã
ããšãã°ãrsyncã䜿çšããŠãã©ã«ããŒåæãæ§æãã1å°ã®ãã·ã³ã§ã®ã¿æåã§ãããã¡ã€ã«ãæŽæ°ã§ããŸãã è€æ°ã®äººã蚌ææžãšãããã¡ã€ã«ã®ç·šéãšäœæã«ã¢ã¯ã»ã¹ã§ãã誰ã§ãä»®æ³ãã·ã³ãšèªåã®ãã·ã³ã®äž¡æ¹ã§äœæ¥ã§ãããããå°ãç°ãªãã¢ãããŒããéžæããŸããïŒèšŒææžãããŒããããã¡ã€ã«ã®gitãªããžããªãäœæããŸããã
ãã®åŸãå°ãæ®ã£ãŠããŸã-gitã®ã¹ã¯ãªãããæŽæ°ããã«ã¯ããã¡ã€ã«ãå®è¡ããŸããããã«ãããJenkinsããŒãã«ãã£ãŠãã¡ã€ã«ãå解ããã蚌ææžãšããŒãã€ã³ã¹ããŒã«ãããŸãã ç§ã®æåã®èãã¯git-hookãæžãããšã§ããããgitãã·ã³ã¯JenkinsããŒãã«ã¢ã¯ã»ã¹ã§ããŸããã ãããããžã§ã³ãã³ã¹ã«ã¯ããããããŸãã ãããŠãJenkinsã¯gitãžã®ããã·ã¥ãçºçãããšãã«éå§ãããžã§ãã®åªããä»äºãããŠããŸã-ãã®ããã«ãwebããã¯ãgitã®ãããžã§ã¯ãã«è¿œå ãããŸãã
ãã®çµæã次ã®ããšãè¡ããŸããã
- ãããã¡ã€ã«ãšèšŒææžãã©ã«ããŒã«* .mobileprovisionããã³* .p12ãå«ãgitãªããžããªãŒ
- gitãããã¡ã€ã«ãååŸããŠã¹ã¯ãªãããå®è¡ããjenkinsã®ãžã§ãïŒ
slavesã¯jenkinsã¹ã¬ãŒãã®é
åããŸãã¯ããããããã®IPã¢ãã¬ã¹ã§ãã xxxXXXxxx -p12ããã®ãã¹ã¯ãŒãã ã¯ããgitã«å
¥ãããã¹ãŠã®èšŒææžã«åããã¹ã¯ãŒãã䜿çšããŸãã
Androidã§ãåãéæ³
Androidãããžã§ã¯ãã§ã¯ãç¶æ³ã¯äžè¬çã«äŒŒãŠããŸãã ã¢ã»ã³ããªã«çœ²åããããã«ããããã¡ã€ã«ãšèšŒææžã®ä»£ããã«ããŒã¹ãã¢ãã¡ã€ã«ã®ã¿ã䜿çšãããŸãã ããŒã¹ãã¢ãã¡ã€ã«ã䜿çšããã«ã¯ããã¹ã¯ãŒããšãšã€ãªã¢ã¹ãç¥ã£ãŠããå¿
èŠããããŸãã Androidã¢ããªã±ãŒã·ã§ã³ãã¢ã»ã³ãã«ããã«ã¯ãGradleã䜿çšããgradle.propertiesèšå®ãã¡ã€ã«ã§æ¬¡ã®æ
å ±ãæå®ããŸãã
releaseStoreFile=/home/jenkins/gradle_keys/customer/project_name.keystore releaseStorePassword=project_pass releaseKeyAlias=project_alias releaseKeyPassword=project_pass
ç°¡åãªç¶æ³ã§ã¯ãããŒã¹ãã¢ãã¡ã€ã«ãã¢ã»ã³ããªãã·ã³ã«é
眮ããŠããããžã§ã¯ãã®.propertiesã«ã¢ããããŒãã§ããŸãã å°é£ã¯ãéçºè
ãšã¢ã»ã³ãã©ãç°ãªããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§äœæ¥ãããšãã«å§ãŸããŸããåãæ¹æ³ã§ãã¹ãŠã®ãã·ã³ã«ããŒãé
眮ããããšã¯å°é£ã§ãã Androidãã«ãåãã®ãœãªã¥ãŒã·ã§ã³ïŒ
- ããŒã¹ãã¢ãšããããã£ã®gitãªããžããª
- ã¹ã¯ãªãããå®è¡ãããžã§ã³ãã³ã¹ãã«ãïŒ
ãã¡ã€ã«ãã¹ã¬ãŒãã«å解ããã¢ã»ã³ããªã¯ãåžžã«ãŠã£ã¶ãŒãã§å®è¡ãããŸãã ãŠã£ã¶ãŒãã¯ãã¹ãŠã®ã³ã¬ã¯ã¿ãŒã«ã¢ã¯ã»ã¹ã§ããŸãã ããŸããŸãªãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®æ£ãããã¹ã瀺ãããã«ããã¡ã€ã«ã¯ãPATH_TO_KEYSããã¬ãŒã¹ãã«ããŒã䜿çšããŠgitã«å
¥ããããŸãã ãã®å Žåããã¡ã€ã«ã¯æ¬¡ã®ããã«ãªããŸãã
releaseStoreFile=PATH_TO_KEYS/customer/project_name.keystore releaseStorePassword=project_pass releaseKeyAlias=project_alias releaseKeyPassword=project_pass
ãã¡ã€ã«å
ã®å¿
èŠãªãã¹ã¯ãsedã³ãã³ãã䜿çšããŠå®è¡æã«çœ®ãæããããŸãã ãªããžããªããããŠã³ããŒããããã¡ã€ã«ãæ°å䜿çšããã«ã¯ããã¹ãå€æŽããåã«ãããããå¥ã®ãã©ã«ããŒã«ã³ããŒããŸãã ãã®äŸã§ã¯ãã¹ã¬ãŒãäžã®ããŒã ãã£ã¬ã¯ããªã¯åãã§ããããŠã£ã¶ãŒãã®ããŒã ãã£ã¬ã¯ããªãšã¯ç°ãªããŸãã
ãªãªãŒã¹ãã«ãã®ãããžã§ã¯ãèšå®ã§ã¯ãgradle.propertiesãžã®ãã¹ã¯ãããžã§ã¯ããã£ã¬ã¯ããªãåºæºã«æå®ãããŠãããããããããã£ãã¡ã€ã«ã¯ã/ gradle_keysã³ã¬ã¯ã¿ãŒã®å
±æãã£ã¬ã¯ããªããäœæ¥ãã£ã¬ã¯ããªã«ã³ããŒããå¿
èŠããããŸãã
cp ~/gradle_keys/customer/project_name.properties ${WORKSPACE}/
ããã«æ¹åããæ¹æ³
ãã¹ãŠã®ã¹ã¬ãŒãã®ã¢ãã¬ã¹ãæžãåºããªãããã«ããã«ã¯ã
Elastic + Axisãã©ã°ã€ã³ã䜿çšããŸããããã«ãããè€æ°ã®ããŒãã§å®è¡ããããã«ã¢ã»ã³ããªãæ§æã§ããŸãã iOSãã«ããŒãæ§æããããã®ã¹ã¯ãªããã¯æ¬¡ã®ããã«ãªããŸãã
rm -f ~/Library/MobileDevice/Provisioning\ Profiles/* cp ${WORKSPACE}/profiles/* ~/Library/MobileDevice/Provisioning\ Profiles/ security unlock-keychain -p jenkins $HOME/Library/Keychains/login.keychain; cd ${WORKSPACE}/certificates/; for a in *; do security import $a -k $HOME/Library/Keychains/login.keychain -P xxxXXXxxx -A; done
Androidãã«ããŒãæ§æããããã®ã¹ã¯ãªããã¯æ¬¡ã®ããã«ãªããŸãã
cd keys KEYS_PATH="$HOME/gradle_keys" REPL_PATH=$(echo "$KEYS_PATH" | sed -e 's/[\/&]/\\&/g') find . -name "*\.properties" | while read line; do sed -i -e "s/PATH_TO_KEYS/$REPL_PATH/g" "$line"; done cp -r ./ $KEYS_PATH
çµè«
圌ãã¯ãè¯ãèšäºãæžããããªããããªãã®æ±ºå®ã®é·æãšçæã«ã€ããŠçµè«ãæžãå¿
èŠããããšèšã£ãŠããŸãã 匷ã¿ã«ããããã¹ãŠãã·ã³ãã«ã§ãïŒ
- ãã®ãœãªã¥ãŒã·ã§ã³ã¯ãã¢ã»ã³ããªã®ãã¡ã€ã«ãå€æŽããã³è¿œå ããéã®æéãç¯çŽããŸã
- ãã®ãœãªã¥ãŒã·ã§ã³ã¯ãã€ã³ãã©ã¹ãã©ã¯ãã£ãæ¡åŒµããªããã¹ã¬ãŒããè¿œå ããæéãç¯çŽããŸã
- ãã®ãœãªã¥ãŒã·ã§ã³ã䜿çšãããšãéèŠãªãã¡ã€ã«ãžã®ã¢ã¯ã»ã¹ãå¶éã§ããŸãïŒããŒãšèšŒææžã¯ãããžã§ã¯ããªããžããªã«ãããŸããïŒ-以åã¯ãããŸããã§ããããäžéšã®ãŠãŒã¶ãŒã¯
- ãžã§ã³ãã³ã¹ã¯èªåã§ã調æŽãããããããã®æ±ºå®ã¯ã¯ãŒã«ã§ã
匱ç¹ïŒ
- ãã®ãœãªã¥ãŒã·ã§ã³ã¯ã1ã€ã®ãªããžããªããã¹ãŠã®Androidãããžã§ã¯ãã®ããŒã«äœ¿çšãããiOSã§ãåæ§ã«äœ¿çšããããšããäºå®ã®ããã«èšèšãããŠããŸãã ãããã£ãŠããããžã®ã¢ã¯ã»ã¹ã®èšå®ã¯æè»æ§ããããŸãã-人ã¯ãã¹ãŠã«ã¢ã¯ã»ã¹ã§ããããäœã«ãã¢ã¯ã»ã¹ã§ããŸããã ãã®ãããªãã¡ã€ã«ãžã®ã¢ã¯ã»ã¹ã«ããã®åéã®ããŒããã¯ãã«ã«ã¹ãã·ã£ãªã¹ããããªããŠããããšãã°ãããžã§ã¯ããããŒãžã£ãŒãããªããã°ããã®ãœãªã¥ãŒã·ã§ã³ã¯æ©èœããŸããã
- ãã®ã¢ãããŒãã®ã»ãã¥ãªãã£ã¯ãäžè¬ã«Jenkinsã®ãªãªãŒã¹ã¢ã»ã³ããªã®ã¢ã€ãã¢ã®å®è£
ã®ã»ãã¥ãªãã£ã«å€§ããäŸåããŠããŸããã€ãŸãããããã䜿çšããå Žåã¯ãããŒãã©ããã«ä¿åããããããžã®ãã¹ãèŠå®ããå¿
èŠããããã»ãã¥ãªãã£ã¯åéãããã¢ããªã±ãŒã·ã§ã³ã®é
åžæ¹æ³ãããJenkinsã¿ã¹ã¯ãJenkinsãšãã®ãã«ããŒãã€ã³ã¹ããŒã«ãããŠãããã·ã³ãžã®ã¢ã¯ã»ã¹ã®èšå®ã
ãããã«
ææ¡ãããã¢ãããŒãã«ãããåœç€Ÿã¯ãã¢ããªã±ãŒã·ã§ã³ã®æ§ç¯ã«å¿
èŠãªå€æ°ã®ã¢ãŒãã£ãã¡ã¯ãã®ç®¡çããã»ã¹ãç°¡çŽ åã§ããŸããã çŸåšãããŒã®å€æŽãšè¿œå ã¯é«éã§å®å®ããŠãããå¿
èŠãªãã¹ãŠã®ãã·ã³ã§å®è¡ã§ããŸãã ãããžã§ã¯ãæ°ã®å¢å ã«ããã€ã³ãã©ã¹ãã©ã¯ãã£ã®æ¡å€§ã«ãããJenkinsã«æ°ããããŒããè¿œå ããã®ãåããããè¿
éãã€ç°¡åã«ãªããŸããã çµéšãå
±æã§ããããšãããããæããŸãããã®èšäºããéçºããã³ãµããŒããããå€æ°ã®ã¢ããªã±ãŒã·ã§ã³ãèç©ãããŠããäŒæ¥ã§åæ§ã®åé¡ã解決ããã®ã«åœ¹ç«ã€ããšãå¬ããæããŸãã