2016/01/23 Cookpad TechConf 2016 http://techconf.cookpad.com/
ΫοΫύουͷܧଓతͳͷͨΊʹ։ൃͱӡ༻͕ ԿΛ͖ͯͨ͠ͷ͔ɺͦͷࣦഊͱޭʹ͍ͭͯ$PPLQBE5FDI$POGΫοΫύουגࣜձࣾΠϯϑϥετϥΫνϟʔ෦ాҰੜ
View Slide
ాҰੜͳΔͨ ͍͍ͬͤ!NJSBLVJΫοΫύουגࣜձࣾΠϯϑϥετϥΫνϟʔ෦ೖࣾ
େલఏ• ࣄۀมԽ͢Δ• ৫มԽ͢Δ• ϓϩμΫτίʔυʹण໋͕͋Δ• ։ൃϦιʔε༗ݶͰ͋Δ
ࠓͷςʔϚ• ݶΒΕͨϦιʔεͰɺͲ͏ͬͯ ৫ࣄۀͷมԽʹڧ͍։ൃΛߦ͏͔• ण໋Խͨ͠ΞϓϦέʔγϣϯͱ Ͳ͏͖߹͍͔ͬͯ͘
ྺ࢙
ʮΫοΫύουʯ͍͔ͭΒ͋Δͷʁ
IUUQTJOGPDPPLQBEDPNDPSQPSBUFIJTUPSZ
IUUQTXFCBSDIJWFPSHXFCIUUQXXXDPPLQBEDPN
$PME'VTJPO3BJMT
[email protected]PMJUI
ෆ໊༪
߃ྫͷSBLFTUBUT ൛+----------------------+-------+-------+---------+---------+-----+-------+| Name | Lines | LOC | Classes | Methods | M/C | LOC/M |+----------------------+-------+-------+---------+---------+-----+-------+| Controllers | 53487 | 43106 | 578 | 4326 | 7 | 7 || Helpers | 16467 | 13482 | 19 | 1544 | 81 | 6 || Models |109238 | 86118 | 1938 | 9700 | 5 | 6 || Mailers | 2259 | 1821 | 47 | 209 | 4 | 6 || Workers | 797 | 678 | 23 | 38 | 1 | 15 || Chanko units | 12737 | 10967 | 20 | 373 | 18 | 27 || Libraries | 52295 | 43235 | 649 | 3954 | 6 | 8 || Feature specs | 56569 | 45583 | 0 | 192 | 0 | 235 || Request specs | 46276 | 39906 | 0 | 18 | 0 | 2215 || Routing specs | 614 | 495 | 0 | 0 | 0 | 0 || Controller specs | 64188 | 53000 | 6 | 128 | 21 | 412 || Helper specs | 84918 | 70300 | 3 | 71 | 23 | 988 || Model specs |163524 |135337 | 5 | 130 | 26 | 1039 || Worker specs | 1156 | 959 | 0 | 1 | 0 | 957 || Chanko unit specs | 9214 | 7596 | 0 | 11 | 0 | 688 || Library specs | 26054 | 21809 | 25 | 125 | 5 | 172 |+----------------------+-------+-------+---------+---------+-----+-------+| Total |699793 |574392 | 3313 | 20820 | 6 | 25 |+----------------------+-------+-------+---------+---------+-----+-------+Code LOC: 199407 Test LOC: 374985 Code to Test Ratio: 1:1.9
Ͱ͔͍ͱԿ͕ى͜Δͷ͔ىಈʹ͕͔͔࣌ؒΔςετʹ͕͔͔࣌ؒΔ੩తղੳܥπʔϧ͕ಈ͔ͳ͍ϥΠϒϥϦ͕ಈ͔ͳ͍σϓϩΠ͕େมϨʔϧʹΕͳ͍
ίʔυڥͷٺԽ
ͳͥਓશ෦ॻ͖ͨ͘͠ͳΔͷ͔
ࠒશϦχϡʔΞϧܭը
ϦχϡʔΞϧܭը• ΤϯδχΞ10ਓ͘Β͍• ίʔυ͕ڊେɾෳࡶ͗ͯ͢ɺ৽ػೳͷ࣮͕ࠔ• ͦͦࠓͷαʔϏε͜ΕͰ͍͍ͷͩΖ͏͔ʁ• ίʔυαʔϏεཧతͳঢ়ଶʹͨ͠ɺ Զͨͪͷߟ͑ͨ࠷ߴͷΫοΫύουʹ͠Α͏w Α͠ϑϧεΫϥονͰॻͧ͘
ϦχϡʔΞϧେࣦഊ
Կ͕ىͬͨ͜ͷ͔ʮαʔϏεͷίΞόϦϡʔΛநग़͢Δʯʮ៉ྷͳίʔυͰΠν͔Βॻ͖͢ʯͷ྆ํΛಉ࣌ʹΖ͏ͱͨ͠ˠ͍ͭ·Ͱܦ࣮͕ͬͯऴΘΒͳ͍
༷ͷཧͱϦϑΝΫλϦϯάΛಉ࣌ʹΒͳ͍ํֶ͕͍͍ͼ
खΕʹͳ͔ͬͯΒΒͳֶ͍ͼ
ͷ3BJMTҠߦ ͳͥ͏·͍ͬͨ͘ͷ͔ΤϯδχΞ5ਓRails ʹৄ͍ࣾ͠һ 0ਓͦΕ΄ͲຊͰྲྀߦͬͯͳ͍
࣌ͷؔऀͷূݴ• αʔϏεͷػೳ͕·ͩগͳ͔ͬͨ• ͢Ͱʹ΅Ζ΅Ζ͔ͩͬͨΒɺ ͦΕҎ্ࣦഊ͠Α͏͕ͳ͔ͬͨ• ͦͦͦΜͳʹޭ͍ͯ͠ͳ͔ͬͨ• ʢҠߦ͕ͨ͠ɺॳ͔ͳΓෆ҆ఆͩͬͨʣ• ए͔ͬͨ
ͰͲ͏͢Ε͍͍ͷ͔
ຊʹཉ͍͠ͷ Կͩͬͨͷ͔ʁ
ͳͥॻ͖͔ͨͬͨ͠ͷ͔• αʔϏεͷܧଓతͳվળ͕͔ͨͬͨ͠• ṖͷෳࡶͳϨΨγʔίʔυ͕ଟ͗ͯ͢ ػೳͷվળՃ͕ࠔ
ϨΨγʔίʔυΛ શ෦ॻ͖͞ͳͯ͘ ։ൃΛམͱͣ͞ ܧଓతͳվળ͕Ͱ͖ΔΑ͏ʹ͢Ε͍͍ͷͰ
ϦχϡʔΞϧࣦഊ͕ੜΈग़ͨ͠$IBOLP
$IBOLPຊ൪ڥͰͷτϥΠ&ΤϥʔΛࢧԉ͢Δ Rails ༻ gemUnit ͱ͍͏୯ҐͰطଘίʔυͷύονΛهड़IUUQTHJUIVCDPNDPPLQBEDIBOLP
" #طଘͷίʔυ A ΛɺελοϑϢʔβͷΈʹରͯ͠ϕʔλ൛ͷίʔυ B ʹஔ͖͍͑ͨͨͩ͠ɺB ݥతͳ࣮ͳͷͰɺྫ֎͕ൃੜ͢Δ͔͠Εͳ͍طଘͷ$POUSPMMFSͷίʔυ ϕʔλ൛ͷίʔυ
ελοϑͳΒ##Ͱྫ֎͕ى͖ͨΒ"ελοϑҎ֎ͳΒ"ϑϥάͰذ͍ͤͯ͘͞ͱίʔυ͕ԚΕ͍ͯ͘
ϕʔλػೳͷ6OJUطଘͷ$POUSPMMFSͷίʔυ"#Chanko ͰɺUnit ͱ͍͏ϑΝΠϧʹϕʔλػೳͷϩδοΫΛهड़͢Δinvoke ݅Λຬͨͨ͠߹ʹɺطଘϩδοΫ (A) ͷΘΓʹ Unit (B) ͕࣮ߦ͞ΕΔB ͕ྫ֎Λىͨ͜͠߹ɺݩͷ A ͕࣮ߦ͞ΕΔͨΊɺϢʔβʹΤϥʔ͕ฦΒͳ͍JOWPLF݅
ແࣄʹՁ͕ೝΊΒΕͨΒຊ൪ͷ࣭ͷίʔυʹ্͛ΔطଘίʔυΛॻ͖͑ɺUnit ϑΝΠϧΛফ͢ ʢ௨শ Un-chankoʣ
dଟαʔϏε࣌
ΫοΫύου ຊମίʔυผϓϩδΣΫτ3BJMT
ϓϩδΣΫτͷ͔Εํ• ࠷ॳ͔ΒผϓϩδΣΫτͱͯ͠࡞ΒΕɺޙ͔Βຊମͱ࿈ܞͨ͠ύλʔϯ• ࠷ॳຊମͷҰ෦ͱͯ͠࡞ΒΕɺ ޙ͔Βͨ͠ύλʔϯ
8PSME`TMBSHFTUSBJMTNPOPMJUIΛ٫͍ͨ͠
ϓϩδΣΫτׂํ• ৽نαʔϏεΛ࡞Δͱ͖• ຊମͱີ݁߹ͤ͟ΔΛಘͳ͍ͷຊମͰ࣮• ͦ͏Ͱͳ͍ͷ࠷ॳ͔ΒผϓϩδΣΫτͰ• طଘαʔϏε• ׂՄೳͳͷॱׂ͍࣍ͯ͘͠
ʙαʔϏεͷׂ
IUUQUFDIMJGFDPPLQBEDPNFOUSZͱ͍͍ͯهࣄɺ͓͢͢Ί
ʮຊԿ͕͍ͨ͠ͷ͔ʯΛݟۃΊΔ• γϯϓϧͳ࡞Γʹม͍͑ͨ• ෆཁͳίʔυ͕ॏͳΓɺಈ࡞͕͘ͳ͍ͬͯΔͱ͜ΖΛղফ͍ͨ͠• ৽͍͠ϥΠϒϥϦɺ৽͍ٕ͠ज़ΛऔΓࠐΊΔΑ͏ʹ͍ͨ͠
େࣄͳ͜ͱҰͭͣͭΔ
ೋஈ֊ͷΞϓϦέʔγϣϯ1.ΫοΫύουຊମΛ fork ͠ɺෆཁ෦Λૈํফͯ͠ςετΛ௨͢2.rails new ͨ͠৽نϓϩδΣΫτʹ ࣸܦͯ͠ςετΛ௨͢
ຊମίʔυΛGPSL ෆཁͳ෦Λૈํআ ςετΛ௨͢ୈஈ֊
͜ͷ࣌Ͱ• ʮ͓͍͍݈͠߁ʯ͚ͩͷςετ࣮ߦɺ σϓϩΠ͕Մೳʹͳͬͨ• ͜Ε͚ͩͰेࣄۀతͳԸܙ͕͋Δ• ফ͖͠Εͳ͔ͬͨґଘϥΠϒϥϦɺ ϞϯΩʔύον͕ଟ͍ͬͯΔঢ়ଶ• ςετ࣮ߦ͕͔ͬͨΓɺϨʔϧ͔Β ͣΕͨΓ͍ͯ͠Δͷ͕
SBJMTOFXͨ͠৽نίʔυϕʔεʹϩδοΫΛҠ২͍͖ͯ͠ɺطଘͷςετ͕௨Δ͜ͱΛࢦ͢ୈஈ֊
ҙ• ϩδοΫҠಈ͢Δ͚ͩ• ϦϑΝΫλϦϯάͨ͘͠ͳͬͯ զຫ͢Δ• ςετΛ௨աͤ͞Δ͜ͱʹूத
ʮ͓͍͍݈͠߁ʯޭ͔Βͷֶͼ• ϑϧεΫϥονͰॻ͖͞ͳ͔ͬͨ• ༷มߋϦϑΝΫλϦϯάΛߦΘͣɺ͚ͩΛߦͬͨ• খنʹগͣͭ͠ਐΊ͍ͯ͘͜ͱͰɺͦΕͧΕͷஈ֊ͰࣄۀతͳϝϦοτΛڗडͰ͖ͨ
ʹΑΔԸܙ• ΫοΫύουຊମ• ࣄۀͻͱͭίʔυ͕খ͘͞ͳͬͨ• ͓͍͍݈͠߁• Ϩʔϧʹͬͨී௨ͷ Rails ΞϓϦέʔγϣϯʹͳΕͨ• ܰྔͰϞμϯͳ։ൃڥʹͳͬͨ
ίʔυ࣭
ίʔυ࣭ϏδωεʹӨڹ͢Δ͔ʁ
ΫοΫύουͷ͑:&4
ίʔυͷ࣭• Մಡੑ• ϝϯςφϯεੑ• όάͷ༗ແ• ηΩϡϦςΟ
ίʔυͷ࣭͕Өڹ͢Δͷ• ։ൃޮ• ଐਓੑwίʔυͷण໋
Ͳ͜·ͰΔ͖͔ʁΓ͗͢ͳ͍ʮ៉ྷͳίʔυʯΛॻ͘͜ͱࣗମ͕తͰͳ͍ࣄۀϑΣʔζʹͱͬͯඞཁͳ࣭·ͰΛࢦ͢
ίʔυϨϏϡʔ• ࣭ͷߴ͍ίʔυϨϏϡʔ͕ίʔυ࣭Λ͋Δఔ୲อ͢Δ• ෛͷҨ࢈Λ͠ʹ͘͘ͳΔ
ίʔυϨϏϡʔΞϯνύλʔϯ• ࠣࡉͳจ๏ͷΈͰᎍΊΔ• ΠϯσϯτɺׅހͳͲ• ͱʹ͔͘ෆໟ
ίʔυن͕͋ΔͱίʔυϨϏϡʔͷޮ͕ྑ͘ͳΔֶͼ
IUUQTHJUIVCDPNDPPLQBETUZMFHVJEF
ಛͦΜͳΜͲͬͪͰ͍͍ͩΖͱ͍͏ͷ݁ߏܾΊͯΔ
͘Β͍ӡ༻ͯ͠Έͯ• ࠷ॳରҙݟଟ͔ͬͨʢʣ• ϏδωεͷίʔυϨϏϡʔͳͷʹจ๏ͷ͠ΐ͏ͳ͍૪͕ల։͞ΕΔɺ Έ͍ͨͳͷΛݟ͔͚ͳ͘ͳͬͨ• จ๏ͷ૪ελΠϧΨΠυͷํͰ ΕΑ͍• ͋ͬͯΑ͔ͬͨελΠϧΨΠυ
ΠϯϑϥͷٺԽ
%$"84
&$$MBTTJD71$
ೋͷʮશ࡞Γ͠ʯΛܦͯ• ׂͷΑ͘Θ͔Βͳ͍ Ṗͷαʔό͕౫ଡ͞Εͨ• શαʔό͕ Infra as Code Խ͞Εͨ• Ͳ͘͞͞Ͱ OS ֤छύοέʔδ͕ΞοϓσʔτͰ͖ͨ
ΠϯϑϥٺԽ• ͢Ͱʹଘࡏ͠ͳ͍αʔόͷ Puppet• OS ϛυϧΣΞ͕ݹ͍··• ڥ͕ݹͯ͘ੈ͔ؒΒִ͞ΕΔ
ΠϯϑϥٺԽͷಛ• ಈ͍͍ͯ͑͞ΕɺΞϓϦέʔγϣϯίʔυ΄ͲٺԽ͕ʹ ͳΓʹ͍͘• େ෯ͳόʔδϣϯΞοϓେม͔͕͔͔ͭ࣌ؒΔͷͰɺඞཁʹͳ͔ͬͯΒ ಈ͖࢝ΊΔͷͰ͍
ࣜભٶIUUQTKBXJLJQFEJBPSHXJLJਆٶࣜભٶ
ࣜભٶਆٶࣜભٶɺਆٶʢҏਆٶʣʹ͓͍ͯߦΘΕΔࣜભٶʢఆظతʹߦΘΕΔભٶʣͰ͋ΔɻਆٶͰɺݪଇͱͯ͠20͝ͱʹɺٶʢߖେਆٶʣɾ֎ٶʢ๛डେਆٶʣͷೋͭͷਖ਼ٶͷਖ਼఼ɺ14ͷผٶͷશͯͷ఼ࣾΛΓସ͑ͯਆ࠲Λભ͢ɻIUUQTKBXJLJQFEJBPSHXJLJਆٶࣜભٶ
ࣜભٶͷ͕͍͜͜͢͝• ༻ͷ͍ݐஙํࣜͳͷʹ ҏਆٶ͓Αͦ1300ଘࡏ͍ͯ͠Δ• 7ੈلͷੜݐஙͷٕज़͕ݱͰ ঝ͞Ε͍ͯΔ• ભٶͷ༻ࡐͱͳΔΛҭͯΔͷʹ 200Ҏ্͔͔Δ
࡞Γ͢͜ͱΛ લఏʹ͢Δ͜ͱͰ ण໋Խֶͼ
*OGSB*OGSB• CentOS 6.2 -> Ubuntu 14.04 (16.04)• Puppet -> Itamae• VPCωοτϫʔΫͷ࠶ઃܭ• ֤छύοέʔδɺϛυϧΣΞͷ όʔδϣϯΞοϓ• ͦͷଞϨΨγʔͷ৽
Πϯϑϥࣜભٶ• ৽͘͠࡞Δαʔό infra2 Ͱ ϓϩϏδϣχϯά͢Δ• طଘͷαʔόগͣͭ͠ infra2 Ͱ ࡞Γ͍ͯ͘͠
·ͱΊ
େલఏʢ࠶ʣ• ࣄۀมԽ͢Δ• ৫มԽ͢Δ• ϓϩμΫτίʔυʹण໋͕͋Δ• ։ൃϦιʔε༗ݶͰ͋Δ
ੜ͖͢ΔࣄۀͷͨΊʹ ٕज़͕Ͱ͖Δ͜ͱ• ࣭৽͠͞Λอͭ͜ͱࣗମΛ ΈԽ͢Δ• खΕʹͳΔલʹগͣͭ͠Δ• ࡉ͔͘ޭମݧΛ࡞ΓɺΞοϓσʔτͷՁΛ৫ʹ࣮ײͤ͞Δ