Cookpad TechConf 2017 https://techconf.cookpad.com/2017/
շదͳαʔϏε։ൃΛࢧ͑Δٕज़Cookpad TechConf 2017 Takashi Kokubun
View Slide
ࣗݾհ▸ ࠃ ਸࢤ / Takashi Kokubun▸ ٕज़෦ ։ൃج൫άϧʔϓ▸ GitHub, Twitter: @k0kubun@k0kubun
ΫοΫύου։ൃޮ্ͷͨΊʹԿΛ͍ͯ͠Δͷ͔
ࠓ͢͜ͱΫοΫύου͕ՁΛಧ͚ΔαΠΫϧ2. ։ൃ3. ςετ4. σϓϩΠ5. ࢹ1. ։ൃڥͷηοτΞοϓ
ࠓ͢͜ͱΫοΫύου͕ՁΛಧ͚ΔαΠΫϧ2. ։ൃ3. ςετ4. σϓϩΠ5. ࢹ1. ։ൃڥͷηοτΞοϓ▸ ͜ͷதͰͲͷΑ͏ͳΛߦ͍ͬͯΔ͔հ͠·͢(WebΞϓϦͷΛத৺ʹ͠·͢)
։ൃڥΛ͑Δ্Ͱେʹ͍ͯ͠Δ͜ͱࠓ͢͜ͱ▸ αʔϏε։ൃऀͷੜ࢈ੑΛୈҰʹߟ͑ͯ։ൃڥΛ͍͑ͯΔ▸ ͨͩ͠ɺతϢʔβʔʹ͘͢ՁΛಧ͚Δ͜ͱͰ͋Δ͜ͱΛΕͳ͍
1. BOOTSTRAPEFFORTS TO IMPROVE PRODUCTIVITY IN
1. ։ൃڥͷηοτΞοϓʹ͓͚Δ▸ curl https://ͻΈͭ/setup.sh | bash▸ ͜ͷίϚϯυҰൃͰ Rails, iOS(macOSͷΈ), Android,ػցֶश ͷ։ൃڥ͕͏▸ ͦͷޙͷߋ৽ద༻ίϚϯυҰൃ։ൃڥͷηοτΞοϓํ๏
setup.sh macOS, Linux ͷͲͪΒͰಈ࡞▸ ΫοΫύουͷ։ൃऀجຊmacOSΛར༻▸ LinuxΛ͍͍ͨਓ͚ʹLinuxαϙʔτ1. ։ൃڥͷηοτΞοϓʹ͓͚Δ
setup.sh ͰԿΛ͍ͯ͠Δͷ͔▸ ߏཧεΫϦϓτͷμϯϩʔυ▸ Chef෩ͷRuby DSLͰهड़͞Ε͍ͯΔ▸ DSLʹΑͬͯOSͳͲͷڥͷࠩҟΛٵऩ͍͢͠▸ ߏཧπʔϧͷ࣮ߦ▸ mrubyͰ࡞ΒΕͨMItamaeͱ͍͏πʔϧΛར༻͍ͯ͠Δ1. ։ൃڥͷηοτΞοϓʹ͓͚Δ
setup.sh ͰԿΛ͍ͯ͠Δͷ͔▸ Chef෩ͷRuby DSL (Itamae DSL)1. ։ൃڥͷηοτΞοϓʹ͓͚Δpackage 'memcached'package 'postgresql'
setup.sh ͰԿΛ͍ͯ͠Δͷ͔▸ Chef෩ͷRuby DSL (Itamae DSL)1. ։ൃڥͷηοτΞοϓʹ͓͚Δpackage 'memcached'package 'postgresql'brew install memcachedbrew install postgresqlmacOS
setup.sh ͰԿΛ͍ͯ͠Δͷ͔▸ Chef෩ͷRuby DSL (Itamae DSL)1. ։ൃڥͷηοτΞοϓʹ͓͚Δpackage 'memcached'package 'postgresql'apt-get install -y memcachedapt-get install -y postgresqlbrew install memcachedbrew install postgresqlUbuntumacOS
mrubyͰ࡞ΒΕͨߏཧπʔϧ: MItamae▸ https://github.com/k0kubun/mitamae▸ ChefϥΠΫͰܰྔͳߏཧπʔϧItamaeͷmruby࣮▸ ϩʔΧϧڥͷద༻ʹಛԽ͓ͯ͠ΓɺItamaeΑΓߴ▸ γϯάϧόΠφϦͰϦϦʔε▸ mrubyͰ࡞͍ͬͯΔͨΊɺRubyͷॲཧܥ͕ͳ࣮ͯ͘ߦՄೳ1. ։ൃڥͷηοτΞοϓʹ͓͚Δ
ͳͥmrubyͰ࡞ΒΕͨπʔϧΛ͍ͬͯΔͷ͔▸ Rubyͩͱ࠷ͰItamae gemΛ͏ඞཁ͕͋Γɺ࣮ߦ࣌ͷґଘ͕ଟ͘ͳΔ▸ ։ൃऀͷRubyͷڥΛ࣮ͬͯߦ͢Δͱɺ։ൃऀͷRubyͷڥ͕յΕͨ࣌ʹ࠶ηοτΞοϓͰ͖ͳ͘ͳΔ▸ ͦͷmrubyͩͱόΠφϦ͑͋͞Εಈ͘▸ Ruby͕ೖͬͯͳ͍LinuxσΟετϦϏϡʔγϣϯͰɺεΫϦϓτ࣮ߦલʹRubyΛ͍Ε͓ͯ͘ඞཁ͕ͳ͍1. ։ൃڥͷηοτΞοϓʹ͓͚Δ
ڥηοτΞοϓʹ͓͚Δ ·ͱΊ▸ ίϚϯυΛҰൃୟ͚ͩ͘Ͱ։ൃ͕࢝ΊΒΕΔ▸ mrubyΛͬͯηοτΞοϓπʔϧͷґଘΛݮΒ͠ɺյΕʹͨ͘͘͠1. ։ൃڥͷηοτΞοϓʹ͓͚Δ
2. DEVELOPMENTEFFORTS TO IMPROVE PRODUCTIVITY IN
ڞ༻ͷ։ൃ༻σʔλϕʔε▸ ։ൃڥͷWebΞϓϦڞ༻ͷ։ൃ༻σʔλϕʔεʹଓ͞Ε͍ͯΔ▸ ͜ͷσʔλϕʔεຊ൪͔Βσʔλ͕ϨϓϦ͞Εͯ͘Δ▸ cookpad.com͚ͩͰͳ͘ଟ͘ͷΞϓϦͰ։ൃڥ͚ʹϨϓϦΛઃఆ͍ͯ͠Δ2. ։ൃʹ͓͚Δ
։ൃ༻σʔλϕʔεͷ▸ ςʔϒϧ໊ΧϥϜ໊ʹsecure_ΛؚΉ߹ϨϓϦ͠ͳ͍▸ ΧϥϜΛ૿ͯ͠ϨϓϦ͕ࢭ·Βͳ͘͢Δ▸ ϨϓϦ͞Εͯ͘Δσʔλͱ։ൃڥͰೖΕͨσʔλͱίϯϑϦΫτͤ͞ͳ͍▸ ݖݶΛదʹཧ͠ɺ҆қʹσʔλϕʔεΛDROPͤ͞ͳ͍2. ։ൃʹ͓͚Δ
։ൃ༻σʔλϕʔεͷ▸ ςετσʔλΛߘ͢Δ࣌Ͱɺຊ൪ڥʹߘ͢ΔͭΓͰಈ࡞֬ೝΛߦ͏▸ มͳσʔλΛ͍ΕΔͱຊ൪Ͱͷମݧͱ։ൃ࣌ͷମݧ͕ҟͳͬͯ͠·͏▸ ৗʹϢʔβʔͷମݧΛҙࣝͯ͠։ൃ͢Δ2. ։ൃʹ͓͚Δ
ϚΠΫϩαʔϏεԽ▸ ҎલશͯͷνʔϜͰҰͭͷWebΞϓϦΛ։ൃ͍͕ͯͨ͠ɺ։ൃ͕େมͩͬͨ▸ ςετ͕૿͑ɺCIʹ͔͔Δ͕࣌ؒංେԽ▸ ΫΤϦґଘ͢ΔϞδϡʔϧ͕ଟ͘ɺ։ൃڥ͕ॏ͍▸ मਖ਼͕ٴ΅͢Өڹൣғ୲ػೳͷڥք͕Θ͔Βͳ͘ͳΔ▸ ෦ॺνʔϜ୯ҐͰαʔϏεΛΓग़͢͜ͱͰ։ൃͨ͘͢͠͠2. ։ൃʹ͓͚Δ
ϚΠΫϩαʔϏεԽΛαϙʔτ͢Δπʔϧ▸ Garage: API༻ͷϑϨʔϜϫʔΫΛ༻͍ͯΠϯλʔϑΣʔεΛ౷Ұ▸ Pact: αʔϏεؒ௨৴ʹ͓͚ΔഁյతมߋΛCI Ͱݕग़▸ Expeditor: αʔϏεڥքͰͷฒྻԽͱোͷϋϯυϦϯά2. ։ൃʹ͓͚Δ
։ൃʹ͓͚Δ ·ͱΊ▸ ຊ൪͔ΒϨϓϦ͞ΕΔσʔλϕʔεΛ͍ɺͰ͖Δ͚ͩຊ൪ʹ͍ۙϢʔβʔମݧΛ࠶ݱ▸ ։ൃ͢͠͞Λ୲อ͠ͳ͕Βదͳ୯ҐͰΞϓϦέʔγϣϯΛׂ͍ͯ͠Δ2. ։ൃʹ͓͚Δ
3. TESTINGEFFORTS TO IMPROVE PRODUCTIVITY IN
JenkinsΛͬͨࣗಈςετ▸ JenkinsΛͬͯmasterͷίϛοτPR୯ҐͰςετΛ࣮ߦ͠ɺૉૣ͘ʹؾ͚ΔΑ͏ʹ͍ͯ͠Δ▸ JenkinsδϣϒͰςετ͕௨ͬͨϦϏδϣϯ͚͕ͩσϓϩΠ͞ΕΔΑ͏ʹ͍ͯ͠Δ▸ Ϣʔβʔʹ໎͕͔͔Βͳ͍Α͏ʹ͢ΔͨΊ3. ςετʹ͓͚Δ
ςετΛࣦഊͤͨ͞ϢʔβʔʹSlackͰϝϯγϣϯ▸ ςετ͕མͪͨίϛοτΛͨ͠ਓʹSlackͰϝϯγϣϯ͢ΔಠࣗJenkinsϓϥάΠϯ▸ 2016ʹHipChat→SlackʹҠߦ▸ GHESlackͳͲͷΞΧϯτใΛ·ͱΊΔࣾγεςϜͱ࿈ܞ3. ςετʹ͓͚Δ
ςετΛࣦഊͤͨ͞ϢʔβʔʹSlackͰϝϯγϣϯ3. ςετʹ͓͚Δ
ςετ༻ΞϓϦέʔγϣϯͷࣗಈσϓϩΠ▸ खಈͰಈ࡞֬ೝ͢ΔͨΊͷڥʹΞϓϦ͕ࣗಈͰσϓϩΠ͞ΕΔ▸ ΄΅ຊ൪ʹ͍ۙڥΛ࠶ݱ▸ ಈ࡞֬ೝΛΈԽ͢Δ͜ͱͰ࣭Λ୲อ3. ςετʹ͓͚Δ
ߴͳςετ࣮ߦ: RRRSpec▸ ςετ͕ଟ͍ΞϓϦέʔγϣϯͰߴʹςετ͕ऴΘΔΑ͏ࢄ࣮ߦ▸ εϙοτΠϯελϯεΛ׆༻ͯ҆͠Ձʹ࣮ݱ3. ςετʹ͓͚Δ
ςετʹ͓͚Δ ·ͱΊ▸ ࣗಈͰߴʹςετ͠ɺૉૣ͘ʹؾ͚ΔΑ͏ʹ͍ͯ͠Δ▸ ಈ࡞֬ೝΛָʹ͢ΔΈΛ࡞ΓɺͳΔ͘Ϣʔβʔʹ໎͕͔͔Βͳ͍Α͏ʹ͍ͯ͠Δ3. ςετʹ͓͚Δ
4. DEPLOYMENTEFFORTS TO IMPROVE PRODUCTIVITY IN
Chat bot, RundeckΛͬͨσϓϩΠ▸ SlackͰ ruboty deploy cookpad ͱൃݴͯ͠σϓϩΠ▸ ruboty: RubyͷChat bot▸ σϓϩΠRundeck্ͰߦΘΕɺଞͷਓϩάΛݟΔ͜ͱ͕Ͱ͖Δ▸ ݖݶཧ͞Ε͓ͯΓɺ։ൃऀ͔͠σϓϩΠͰ͖ͣɺaudit logΔ4. σϓϩΠʹ͓͚Δ
Amazon ECSΛͬͨαʔϏεͷσϓϩΠ▸ Amazon ECSͷσϓϩΠʹͷσϓϩΠπʔϧʮHakoʯΛར༻▸ https://github.com/eagletmt/hako▸ AWSͷαʔϏεڥม͕YAMLͰཧ͞Ε͓ͯΓɺαʔϏε։ൃऀ͕ pull request ϕʔεͰมߋͰ͖Δ▸ RundeckͷίϯιʔϧͰ hako deploy ͕࣮ߦ͞ΕɺAmazon ECS্ʹDockerίϯςφ͕σϓϩΠ͞ΕΔ▸ DockerͷͨΊɺϝΠϯͰ͍ͬͯΔRubyҎ֎ͷݴޠͰσϓϩΠ͕༰қ4. σϓϩΠʹ͓͚Δ
σϓϩΠՄೳ࣌ؒ▸ ݄ʙ༵ͷ 9:30-17:00 or ༵ۚͷ 9:30-15:00 ͔͠σϓϩΠͰ͖ͳ͍▸ Ϣʔβʔʹ໎͕͔͔Βͳ͍Α͏ɺΠϯϑϥ͕ࢹͰ͖ͳ͍ٳͷલσϓϩΠ͠ͳ͍▸ ruboty͔ΒσϓϩΠ͠Α͏ͱ͢ΔͱνΣοΫ͞ΕΔ4. σϓϩΠʹ͓͚Δ
σϓϩΠՄೳ࣌ؒ4. σϓϩΠʹ͓͚Δ
σϓϩΠϩοΫ▸ ͙͢ʹσϓϩΠ͞ΕΔͱࠔΔΑ͏ͳมߋΛͨ࣌͠ͷͨΊͷ҆શஔ▸ RundeckͷδϣϒΛdisable͢ΔAPIΛୟ͍ͯϩοΫ▸ ΫοΫύουͷΑ͏ʹ Docker ΛΘͣී௨ͷ EC2ΠϯελϯεʹσϓϩΠ͞Ε͍ͯΔҰ෦ͷαʔϏεͰɺΦʔτεέʔϧ͍ͯ͠Δ࣌ࣗಈͰϩοΫ͞ΕΔ4. σϓϩΠʹ͓͚Δ
σϓϩΠϩοΫ4. σϓϩΠʹ͓͚Δ
HakoΛͬͨδϣϒͷ࣮ߦ▸ HakoαʔϏεͷσϓϩΠ͚ͩͰͳ͘ɺAmazon ECS্ͰίϚϯυΛ࣮ߦ͢Δͷʹ͑Δ (hako oneshotίϚϯυ)▸ ΦϑϥΠϯδϣϒ hako oneshot ΛͬͯECS্Ͱ࣮ߦ͞ΕΔ▸ δϣϒεέδϡʔϥ(Kuroko2)δϣϒΩϡʔ(Barbeque)͕HakoΛαϙʔτ͍ͯ͠ΔͨΊ▸ ςετΛ௨͍ͬͯΔ࠷৽ͷϦϏδϣϯΛ͏Α͏ʹͳ͓ͬͯΓɺσϓϩΠ͕ෆཁ (ඞཁͳ߹Slack͔ΒϩοΫՄೳ)4. σϓϩΠʹ͓͚Δ
σϓϩΠʹ͓͚Δ ·ͱΊ▸ Ruboty, Rundeck, Hako, ECSΛར༻ͨ͠σϓϩΠڥ▸ σϓϩΠʹΑͬͯϢʔβʔʹ໎͕͔͔Γʹ͍͘Έʹ͍ͯ͠Δ4. σϓϩΠʹ͓͚Δ
5. MONITORINGEFFORTS TO IMPROVE PRODUCTIVITY IN
Sentry, SlackΛͬͯΤϥʔΛࢹ▸ ΤϥʔϩάfluentdΛ௨ͯ͡Sentryʹૹ৴͞ΕΔ▸ σϓϩΠޙSentryΛࢹ͠ɺԿ͔Τϥʔ͕ى͖ͨΒରԠ͢Δ▸ Sentry͔ΒSlackʹ௨͞ΕΔ5. ࢹʹ͓͚Δ
δϣϒ͕ࣦഊͨ͠ΒSlackϝʔϧͰ௨▸ ΦϑϥΠϯδϣϒ͕ࣦഊͨ͠߹SlackͰ௨Ͱ͖Δ▸ Kuroko2Barbeque͕Slackͷ௨Λαϙʔτ▸ BarbequeͰ࣮ߦ͍ͯ͠ΔδϣϒɺҰ෦ͷΤϥʔࣗಈͰϦτϥΠΛઃఆ͍ͯ͠Δ5. ࢹʹ͓͚Δ
ECSͷϩάʹෆ৹ͳϩά͕ͳ͍͔֬ೝ▸ HakoͰσϓϩΠͨ͠αʔϏεͷϩάࣾγεςϜͰϩάΛҰཡͰ͖Δ▸ αʔόʔʹsshͯ͠lesstail -fΛ͢ΔΑΓख͕ؒগͳ͍5. ࢹʹ͓͚Δ
αʔϏεͷোZabbixͰࢹ▸ αʔϏεͷোZabbixͰࢹ▸ ࣗಈͰSlackʹ௨▸ waker (https://github.com/ryotarai/waker) ͱ࿈ܞͯ͠TwilioͰి͕͔͔Δ▸ ओʹΠϯϑϥ͕൪੍Ͱ24࣌ؒରԠ5. ࢹʹ͓͚Δ
ࢹʹ͓͚Δ ·ͱΊ▸ Կ͔ى͖ͨΒ͙͢ʹؾ͚ΔΑ͏ͳΈʹ͍ͯ͠Δ▸ Τϥʔͳ͘ՁΛಧ͚Δͱ͜Ζ·Ͱ͕αʔϏε։ൃ5. ࢹʹ͓͚Δ
։ൃڥΛ͑Δ্Ͱେʹ͍ͯ͠Δ͜ͱ;Γ͔͑Γ▸ αʔϏε։ൃऀͷੜ࢈ੑΛୈҰʹߟ͑ͯ։ൃڥΛ͍͑ͯΔ▸ ͨͩ͠ɺతϢʔβʔʹ͘͢ՁΛಧ͚Δ͜ͱͰ͋Δ͜ͱΛΕͳ͍
ิεϥΠυ▸ ӈ্ͷΞΠίϯͦͷࢪࡦʹؔΘͬͨਓͷGitHubΞΠίϯΛද͓ͯ͠ΓɺؔΘΓ͕େ͖͍ਓॱʹࠨ͔ΒฒΜͰ͍·͢adorechicamutakedraftcodeeagletmteisukeEugeneKatok0kubunmakimotomiyagawaryotaraisorahtaiki45takai