Slide 1

Slide 1 text

շదͳαʔϏε։ൃΛࢧ͑Δٕज़ Cookpad TechConf 2017 Takashi Kokubun

Slide 2

Slide 2 text

ࣗݾ঺հ ▸ ࠃ෼ ਸࢤ / Takashi Kokubun ▸ ٕज़෦ ։ൃج൫άϧʔϓ ▸ GitHub, Twitter: @k0kubun @k0kubun

Slide 3

Slide 3 text

ΫοΫύου͸ ։ൃޮ཰޲্ͷͨΊʹ ԿΛ͍ͯ͠Δͷ͔

Slide 4

Slide 4 text

ࠓ೔࿩͢͜ͱ ΫοΫύου͕Ձ஋Λಧ͚ΔαΠΫϧ 2. ։ൃ 3. ςετ 4. σϓϩΠ 5. ؂ࢹ 1. ։ൃ؀ڥͷ ηοτΞοϓ

Slide 5

Slide 5 text

ࠓ೔࿩͢͜ͱ ΫοΫύου͕Ձ஋Λಧ͚ΔαΠΫϧ 2. ։ൃ 3. ςετ 4. σϓϩΠ 5. ؂ࢹ 1. ։ൃ؀ڥͷ ηοτΞοϓ ▸ ͜ͷதͰͲͷΑ͏ͳ޻෉Λ ߦ͍ͬͯΔ͔঺հ͠·͢ (WebΞϓϦͷ࿩Λத৺ʹ࿩͠·͢)

Slide 6

Slide 6 text

։ൃ؀ڥΛ੔͑Δ্Ͱେ੾ʹ͍ͯ͠Δ͜ͱ ࠓ೔࿩͢͜ͱ ▸ αʔϏε։ൃऀͷੜ࢈ੑΛୈҰʹߟ͑ͯ։ൃ؀ڥΛ ੔͍͑ͯΔ ▸ ͨͩ͠ɺ໨త͸Ϣʔβʔʹ͢͹΍͘Ձ஋Λಧ͚Δ͜ͱͰ͋Δ ͜ͱΛ๨Εͳ͍

Slide 7

Slide 7 text

1. BOOTSTRAP EFFORTS TO IMPROVE PRODUCTIVITY IN

Slide 8

Slide 8 text

1. ։ൃ؀ڥͷηοτΞοϓʹ͓͚Δ޻෉ ▸ curl https://ͻΈͭ/setup.sh | bash ▸ ͜ͷίϚϯυҰൃͰ Rails, iOS(macOSͷΈ), Android, ػցֶश ͷ։ൃ؀ڥ͕੔͏ ▸ ͦͷޙͷߋ৽΍ద༻΋ίϚϯυҰൃ ։ൃ؀ڥͷηοτΞοϓํ๏

Slide 9

Slide 9 text

setup.sh ͸ macOS, Linux ͷͲͪΒͰ΋ಈ࡞ ▸ ΫοΫύουͷ։ൃऀ͸جຊmacOSΛར༻ ▸ LinuxΛ࢖͍͍ͨਓ޲͚ʹLinux΋αϙʔτ 1. ։ൃ؀ڥͷηοτΞοϓʹ͓͚Δ޻෉

Slide 10

Slide 10 text

setup.sh ͰԿΛ͍ͯ͠Δͷ͔ ▸ ߏ੒؅ཧεΫϦϓτͷμ΢ϯϩʔυ ▸ Chef෩ͷRuby DSLͰهड़͞Ε͍ͯΔ ▸ DSLʹΑͬͯOSͳͲͷ؀ڥͷࠩҟΛٵऩ͠΍͍͢ ▸ ߏ੒؅ཧπʔϧͷ࣮ߦ ▸ mrubyͰ࡞ΒΕͨMItamaeͱ͍͏πʔϧΛར༻͍ͯ͠Δ 1. ։ൃ؀ڥͷηοτΞοϓʹ͓͚Δ޻෉

Slide 11

Slide 11 text

setup.sh ͰԿΛ͍ͯ͠Δͷ͔ ▸ Chef෩ͷRuby DSL (Itamae DSL) 1. ։ൃ؀ڥͷηοτΞοϓʹ͓͚Δ޻෉ package 'memcached' package 'postgresql'

Slide 12

Slide 12 text

setup.sh ͰԿΛ͍ͯ͠Δͷ͔ ▸ Chef෩ͷRuby DSL (Itamae DSL) 1. ։ൃ؀ڥͷηοτΞοϓʹ͓͚Δ޻෉ package 'memcached' package 'postgresql' brew install memcached brew install postgresql macOS

Slide 13

Slide 13 text

setup.sh ͰԿΛ͍ͯ͠Δͷ͔ ▸ Chef෩ͷRuby DSL (Itamae DSL) 1. ։ൃ؀ڥͷηοτΞοϓʹ͓͚Δ޻෉ package 'memcached' package 'postgresql' apt-get install -y memcached apt-get install -y postgresql brew install memcached brew install postgresql Ubuntu macOS

Slide 14

Slide 14 text

mrubyͰ࡞ΒΕͨߏ੒؅ཧπʔϧ: MItamae ▸ https://github.com/k0kubun/mitamae ▸ ChefϥΠΫͰܰྔͳߏ੒؅ཧπʔϧItamaeͷmruby࣮૷ ▸ ϩʔΧϧ؀ڥ΁ͷద༻ʹಛԽ͓ͯ͠ΓɺItamaeΑΓߴ଎ ▸ γϯάϧόΠφϦͰϦϦʔε ▸ mrubyͰ࡞͍ͬͯΔͨΊɺRubyͷॲཧܥ͕ͳͯ͘΋ ࣮ߦՄೳ 1. ։ൃ؀ڥͷηοτΞοϓʹ͓͚Δ޻෉

Slide 15

Slide 15 text

ͳͥmrubyͰ࡞ΒΕͨπʔϧΛ࢖͍ͬͯΔͷ͔ ▸ Rubyͩͱ࠷௿Ͱ΋Itamae gemΛ࢖͏ඞཁ͕͋Γɺ࣮ߦ࣌ͷ ґଘ͕ଟ͘ͳΔ ▸ ։ൃऀͷRubyͷ؀ڥΛ࢖࣮ͬͯߦ͢Δͱɺ։ൃऀͷRubyͷ ؀ڥ͕յΕͨ࣌ʹ࠶౓ηοτΞοϓͰ͖ͳ͘ͳΔ ▸ ͦͷ఺mrubyͩͱόΠφϦ͑͋͞Ε͹ಈ͘ ▸ Ruby͕ೖͬͯͳ͍LinuxσΟετϦϏϡʔγϣϯͰ΋ɺ εΫϦϓτ࣮ߦલʹRubyΛ͍Ε͓ͯ͘ඞཁ͕ͳ͍ 1. ։ൃ؀ڥͷηοτΞοϓʹ͓͚Δ޻෉

Slide 16

Slide 16 text

؀ڥηοτΞοϓʹ͓͚Δ޻෉ ·ͱΊ ▸ ίϚϯυΛҰൃୟ͚ͩ͘Ͱ։ൃ͕࢝ΊΒΕΔ ▸ mrubyΛ࢖ͬͯηοτΞοϓπʔϧͷґଘΛݮΒ͠ɺ յΕʹͨ͘͘͠ 1. ։ൃ؀ڥͷηοτΞοϓʹ͓͚Δ޻෉

Slide 17

Slide 17 text

2. DEVELOPMENT EFFORTS TO IMPROVE PRODUCTIVITY IN

Slide 18

Slide 18 text

ڞ༻ͷ։ൃ༻σʔλϕʔε ▸ ։ൃ؀ڥͷWebΞϓϦ͸ڞ༻ͷ։ൃ༻σʔλϕʔεʹ઀ଓ ͞Ε͍ͯΔ ▸ ͜ͷσʔλϕʔε͸ຊ൪͔Βσʔλ͕ϨϓϦ͞Εͯ͘Δ ▸ cookpad.com͚ͩͰͳ͘ଟ͘ͷΞϓϦͰ։ൃ؀ڥ޲͚ʹ ϨϓϦΛઃఆ͍ͯ͠Δ 2. ։ൃʹ͓͚Δ޻෉

Slide 19

Slide 19 text

։ൃ༻σʔλϕʔεͷ޻෉ ▸ ςʔϒϧ໊΍ΧϥϜ໊ʹsecure_ΛؚΉ৔߹͸ϨϓϦ͠ͳ͍ ▸ ΧϥϜΛ૿΍ͯ͠΋ϨϓϦ͕ࢭ·Βͳ͘͢Δ ▸ ϨϓϦ͞Εͯ͘Δσʔλͱ։ൃ؀ڥͰೖΕͨσʔλͱ ίϯϑϦΫτͤ͞ͳ͍ ▸ ݖݶΛద੾ʹ؅ཧ͠ɺ҆қʹσʔλϕʔεΛDROPͤ͞ͳ͍ 2. ։ൃʹ͓͚Δ޻෉

Slide 20

Slide 20 text

։ൃ༻σʔλϕʔεͷ޻෉ ▸ ςετσʔλΛ౤ߘ͢Δ࣌Ͱ΋ɺຊ൪؀ڥʹ౤ߘ͢Δ ͭ΋ΓͰಈ࡞֬ೝΛߦ͏ ▸ มͳσʔλΛ͍ΕΔͱຊ൪Ͱͷମݧͱ։ൃ࣌ͷମݧ͕ ҟͳͬͯ͠·͏ ▸ ৗʹϢʔβʔͷମݧΛҙࣝͯ͠։ൃ͢Δ 2. ։ൃʹ͓͚Δ޻෉

Slide 21

Slide 21 text

ϚΠΫϩαʔϏεԽ ▸ Ҏલ͸શͯͷνʔϜͰҰͭͷWebΞϓϦΛ։ൃ͍͕ͯͨ͠ɺ ։ൃ͕େมͩͬͨ ▸ ςετ͕૿͑ɺCIʹ͔͔Δ͕࣌ؒංେԽ ▸ ΫΤϦ΍ґଘ͢ΔϞδϡʔϧ͕ଟ͘ɺ։ൃ؀ڥ͕ॏ͍ ▸ मਖ਼͕ٴ΅͢Өڹൣғ΍୲౰ػೳͷڥք͕Θ͔Βͳ͘ͳΔ ▸ ෦ॺ΍νʔϜ୯ҐͰαʔϏεΛ੾Γग़͢͜ͱͰ ։ൃ͠΍ͨ͘͢͠ 2. ։ൃʹ͓͚Δ޻෉

Slide 22

Slide 22 text

ϚΠΫϩαʔϏεԽΛαϙʔτ͢Δπʔϧ ▸ Garage: API༻ͷϑϨʔϜϫʔΫΛ༻͍ͯ ΠϯλʔϑΣʔεΛ౷Ұ ▸ Pact: αʔϏεؒ௨৴ʹ͓͚ΔഁյతมߋΛCI Ͱݕग़ ▸ Expeditor: αʔϏεڥքͰͷฒྻԽͱো֐ͷϋϯυϦϯά 2. ։ൃʹ͓͚Δ޻෉

Slide 23

Slide 23 text

։ൃʹ͓͚Δ޻෉ ·ͱΊ ▸ ຊ൪͔ΒϨϓϦ͞ΕΔσʔλϕʔεΛ࢖͍ɺ Ͱ͖Δ͚ͩຊ൪ʹ͍ۙϢʔβʔମݧΛ࠶ݱ ▸ ։ൃ͠΍͢͞Λ୲อ͠ͳ͕Βద੾ͳ୯ҐͰ ΞϓϦέʔγϣϯΛ෼ׂ͍ͯ͠Δ 2. ։ൃʹ͓͚Δ޻෉

Slide 24

Slide 24 text

3. TESTING EFFORTS TO IMPROVE PRODUCTIVITY IN

Slide 25

Slide 25 text

JenkinsΛ࢖ͬͨࣗಈςετ ▸ JenkinsΛ࢖ͬͯmasterͷίϛοτ΍PR୯ҐͰςετΛ ࣮ߦ͠ɺૉૣ͘໰୊ʹؾ෇͚ΔΑ͏ʹ͍ͯ͠Δ ▸ JenkinsδϣϒͰςετ͕௨ͬͨϦϏδϣϯ͚͕ͩσϓϩΠ ͞ΕΔΑ͏ʹ͍ͯ͠Δ ▸ Ϣʔβʔʹ໎࿭͕͔͔Βͳ͍Α͏ʹ͢ΔͨΊ 3. ςετʹ͓͚Δ޻෉

Slide 26

Slide 26 text

ςετΛࣦഊͤͨ͞ϢʔβʔʹSlackͰϝϯγϣϯ ▸ ςετ͕མͪͨίϛοτΛͨ͠ਓʹSlackͰϝϯγϣϯ͢Δ ಠࣗJenkinsϓϥάΠϯ ▸ 2016೥ʹHipChat→SlackʹҠߦ ▸ GHE΍SlackͳͲͷΞΧ΢ϯτ৘ใΛ·ͱΊΔࣾ಺ γεςϜͱ࿈ܞ 3. ςετʹ͓͚Δ޻෉

Slide 27

Slide 27 text

ςετΛࣦഊͤͨ͞ϢʔβʔʹSlackͰϝϯγϣϯ 3. ςετʹ͓͚Δ޻෉

Slide 28

Slide 28 text

ςετ༻ΞϓϦέʔγϣϯͷࣗಈσϓϩΠ ▸ खಈͰಈ࡞֬ೝ͢ΔͨΊͷ؀ڥʹΞϓϦ͕ࣗಈͰσϓϩΠ ͞ΕΔ ▸ ΄΅ຊ൪ʹ͍ۙ؀ڥΛ࠶ݱ ▸ ಈ࡞֬ೝΛ࢓૊ΈԽ͢Δ͜ͱͰ඼࣭Λ୲อ 3. ςετʹ͓͚Δ޻෉

Slide 29

Slide 29 text

ߴ଎ͳςετ࣮ߦ: RRRSpec ▸ ςετ͕ଟ͍ΞϓϦέʔγϣϯͰ΋ߴ଎ʹςετ͕ ऴΘΔΑ͏෼ࢄ࣮ߦ ▸ εϙοτΠϯελϯεΛ׆༻ͯ҆͠Ձʹ࣮ݱ 3. ςετʹ͓͚Δ޻෉

Slide 30

Slide 30 text

ςετʹ͓͚Δ޻෉ ·ͱΊ ▸ ࣗಈͰߴ଎ʹςετ͠ɺૉૣ͘໰୊ʹؾ෇͚ΔΑ͏ʹ ͍ͯ͠Δ ▸ ಈ࡞֬ೝΛָʹ͢Δ࢓૊ΈΛ࡞ΓɺͳΔ΂͘Ϣʔβʔʹ ໎࿭͕͔͔Βͳ͍Α͏ʹ͍ͯ͠Δ 3. ςετʹ͓͚Δ޻෉

Slide 31

Slide 31 text

4. DEPLOYMENT EFFORTS TO IMPROVE PRODUCTIVITY IN

Slide 32

Slide 32 text

Chat bot, RundeckΛ࢖ͬͨσϓϩΠ ▸ SlackͰ ruboty deploy cookpad ͱൃݴͯ͠σϓϩΠ ▸ ruboty: Ruby੡ͷChat bot ▸ σϓϩΠ͸Rundeck্ͰߦΘΕɺଞͷਓ΋ϩάΛ ݟΔ͜ͱ͕Ͱ͖Δ ▸ ݖݶ؅ཧ͞Ε͓ͯΓɺ։ൃऀ͔͠σϓϩΠͰ͖ͣɺ audit log΋࢒Δ 4. σϓϩΠʹ͓͚Δ޻෉

Slide 33

Slide 33 text

Amazon ECSΛ࢖ͬͨαʔϏεͷσϓϩΠ ▸ Amazon ECS΁ͷσϓϩΠʹ͸಺੡ͷσϓϩΠπʔϧʮHakoʯΛར༻ ▸ https://github.com/eagletmt/hako ▸ AWSͷαʔϏε΍؀ڥม਺͕YAMLͰ؅ཧ͞Ε͓ͯΓɺ αʔϏε։ൃऀ͕ pull request ϕʔεͰมߋͰ͖Δ ▸ RundeckͷίϯιʔϧͰ hako deploy ͕࣮ߦ͞ΕɺAmazon ECS্ʹ Dockerίϯςφ͕σϓϩΠ͞ΕΔ ▸ DockerͷͨΊɺϝΠϯͰ࢖͍ͬͯΔRubyҎ֎ͷݴޠͰ΋σϓϩΠ͕ ༰қ 4. σϓϩΠʹ͓͚Δ޻෉

Slide 34

Slide 34 text

σϓϩΠՄೳ࣌ؒ ▸ ݄ʙ໦༵೔ͷ 9:30-17:00 or ༵ۚ೔ͷ 9:30-15:00 ͔͠ σϓϩΠͰ͖ͳ͍ ▸ Ϣʔβʔʹ໎࿭͕͔͔Βͳ͍Α͏ɺΠϯϑϥ͕؂ࢹ Ͱ͖ͳ͍໷΍ٳ೔ͷલ͸σϓϩΠ͠ͳ͍ ▸ ruboty͔ΒσϓϩΠ͠Α͏ͱ͢ΔͱνΣοΫ͞ΕΔ 4. σϓϩΠʹ͓͚Δ޻෉

Slide 35

Slide 35 text

σϓϩΠՄೳ࣌ؒ 4. σϓϩΠʹ͓͚Δ޻෉

Slide 36

Slide 36 text

σϓϩΠϩοΫ ▸ ͙͢ʹσϓϩΠ͞ΕΔͱࠔΔΑ͏ͳมߋΛͨ࣌͠ͷͨΊͷ ҆શ૷ஔ ▸ RundeckͷδϣϒΛdisable͢ΔAPIΛୟ͍ͯϩοΫ ▸ ΫοΫύουͷΑ͏ʹ Docker Λ࢖Θͣී௨ͷ EC2 ΠϯελϯεʹσϓϩΠ͞Ε͍ͯΔҰ෦ͷαʔϏεͰ͸ɺ Φʔτεέʔϧ͍ͯ͠Δ࣌΋ࣗಈͰϩοΫ͞ΕΔ 4. σϓϩΠʹ͓͚Δ޻෉

Slide 37

Slide 37 text

σϓϩΠϩοΫ 4. σϓϩΠʹ͓͚Δ޻෉

Slide 38

Slide 38 text

σϓϩΠϩοΫ 4. σϓϩΠʹ͓͚Δ޻෉

Slide 39

Slide 39 text

σϓϩΠϩοΫ 4. σϓϩΠʹ͓͚Δ޻෉

Slide 40

Slide 40 text

HakoΛ࢖ͬͨδϣϒͷ࣮ߦ ▸ Hako͸αʔϏεͷσϓϩΠ͚ͩͰͳ͘ɺAmazon ECS্Ͱ ίϚϯυΛ࣮ߦ͢Δͷʹ΋࢖͑Δ (hako oneshotίϚϯυ) ▸ ΦϑϥΠϯδϣϒ͸ hako oneshot Λ࢖ͬͯECS্Ͱ࣮ߦ͞ΕΔ ▸ δϣϒεέδϡʔϥ(Kuroko2)΍δϣϒΩϡʔ(Barbeque)͕ HakoΛαϙʔτ͍ͯ͠ΔͨΊ ▸ ςετΛ௨͍ͬͯΔ࠷৽ͷϦϏδϣϯΛ࢖͏Α͏ʹͳ͓ͬͯΓɺ σϓϩΠ͕ෆཁ (ඞཁͳ৔߹͸Slack͔ΒϩοΫՄೳ) 4. σϓϩΠʹ͓͚Δ޻෉

Slide 41

Slide 41 text

σϓϩΠʹ͓͚Δ޻෉ ·ͱΊ ▸ Ruboty, Rundeck, Hako, ECSΛར༻ͨ͠σϓϩΠ؀ڥ ▸ σϓϩΠʹΑͬͯϢʔβʔʹ໎࿭͕͔͔Γʹ͍͘࢓૊Έʹ͠ ͍ͯΔ 4. σϓϩΠʹ͓͚Δ޻෉

Slide 42

Slide 42 text

5. MONITORING EFFORTS TO IMPROVE PRODUCTIVITY IN

Slide 43

Slide 43 text

Sentry, SlackΛ࢖ͬͯΤϥʔΛ؂ࢹ ▸ Τϥʔϩά͸fluentdΛ௨ͯ͡Sentryʹૹ৴͞ΕΔ ▸ σϓϩΠޙ͸SentryΛ؂ࢹ͠ɺԿ͔Τϥʔ͕ى͖ͨΒରԠ ͢Δ ▸ Sentry͔ΒSlackʹ΋௨஌͞ΕΔ 5. ؂ࢹʹ͓͚Δ޻෉

Slide 44

Slide 44 text

δϣϒ͕ࣦഊͨ͠ΒSlack΍ϝʔϧͰ௨஌ ▸ ΦϑϥΠϯδϣϒ͕ࣦഊͨ͠৔߹΋Slack౳Ͱ௨஌Ͱ͖Δ ▸ Kuroko2΍Barbeque͕Slackͷ௨஌Λαϙʔτ ▸ BarbequeͰ࣮ߦ͍ͯ͠Δδϣϒ͸ɺҰ෦ͷΤϥʔ͸ࣗಈͰ ϦτϥΠΛઃఆ͍ͯ͠Δ 5. ؂ࢹʹ͓͚Δ޻෉

Slide 45

Slide 45 text

ECSͷϩάʹෆ৹ͳϩά͕ͳ͍͔֬ೝ ▸ HakoͰσϓϩΠͨ͠αʔϏεͷϩά͸ࣾ಺γεςϜͰ ϩάΛҰཡͰ͖Δ ▸ αʔόʔʹsshͯ͠less΍tail -fΛ͢ΔΑΓख͕ؒগͳ͍ 5. ؂ࢹʹ͓͚Δ޻෉

Slide 46

Slide 46 text

αʔϏεͷো֐͸ZabbixͰ؂ࢹ ▸ αʔϏεͷো֐͸ZabbixͰ؂ࢹ ▸ ࣗಈͰSlackʹ௨஌ ▸ waker (https://github.com/ryotarai/waker) ͱ࿈ܞͯ͠ TwilioͰి࿩͕͔͔Δ ▸ ओʹΠϯϑϥ͕౰൪੍Ͱ24࣌ؒରԠ 5. ؂ࢹʹ͓͚Δ޻෉

Slide 47

Slide 47 text

؂ࢹʹ͓͚Δ޻෉ ·ͱΊ ▸ Կ͔ى͖ͨΒ͙͢ʹؾ෇͚ΔΑ͏ͳ࢓૊Έʹ͍ͯ͠Δ ▸ Τϥʔͳ͘Ձ஋Λಧ͚Δͱ͜Ζ·Ͱ͕αʔϏε։ൃ 5. ؂ࢹʹ͓͚Δ޻෉

Slide 48

Slide 48 text

։ൃ؀ڥΛ੔͑Δ্Ͱେ੾ʹ͍ͯ͠Δ͜ͱ ;Γ͔͑Γ ▸ αʔϏε։ൃऀͷੜ࢈ੑΛୈҰʹߟ͑ͯ։ൃ؀ڥΛ ੔͍͑ͯΔ ▸ ͨͩ͠ɺ໨త͸Ϣʔβʔʹ͢͹΍͘Ձ஋Λಧ͚Δ͜ͱͰ͋Δ ͜ͱΛ๨Εͳ͍

Slide 49

Slide 49 text

ิ଍εϥΠυ ▸ ӈ্ͷΞΠίϯ͸ͦͷࢪࡦʹؔΘͬͨਓͷGitHubΞΠίϯ Λද͓ͯ͠ΓɺؔΘΓ͕େ͖͍ਓॱʹࠨ͔ΒฒΜͰ͍·͢ adorechic amutake draftcode eagletmt eisuke EugeneKato k0kubun makimoto miyagawa ryotarai sorah taiki45 takai