Webサービスにて200週連続で新機能をリリースする舞台裏 / builderscon tokyo 2018

F9e11bea0c22333596791dd0696f5d4f?s=47 KASUYA, Daisuke
September 05, 2018

Webサービスにて200週連続で新機能をリリースする舞台裏 / builderscon tokyo 2018

F9e11bea0c22333596791dd0696f5d4f?s=128

KASUYA, Daisuke

September 05, 2018
Tweet

Transcript

  1. WebαʔϏεʹͯ200ि࿈ଓͰ ৽ػೳΛϦϦʔε͢Δ෣୆ཪ 2018-09-07 builderscon tokyo 2018 גࣜձࣾ͸ͯͳ | പ୩ େี

    (@daiksy)
  2. Who are you? പ୩ େี(@daiksy) ▸ גࣜձࣾ͸ͯͳ. ▸ Mackerel σΟϨΫλʔ

    ▸ ScalaMatsuri, Scalaؔ੢Summit ▸ ૉਓDJ
  3. Who are you? ஶॻ

  4. ͓खݩͷQRίʔυ͔Βɺ ͥͻϑΟʔυόοΫΛ͓ئ͍͠·͢

  5. https://mackerel.io WebαʔϏεʹͯ200ि࿈ଓͰ৽ػೳΛϦϦʔε͢Δ෣୆ཪ

  6. https://mackerel.io WebαʔϏεʹͯ200ि࿈ଓͰ৽ػೳΛϦϦʔε͢Δ෣୆ཪ

  7. https://mackerel.io WebαʔϏεʹͯ200ि࿈ଓͰ৽ػೳΛϦϦʔε͢Δ෣୆ཪ

  8. https://mackerel.io WebαʔϏεʹͯ200ि࿈ଓͰ৽ػೳΛϦϦʔε͢Δ෣୆ཪ

  9. Mackerel ▸ 2013೥11݄ʹ࠷ॳͷίϛοτ ▸ 2014೥5݄8೔ βϦϦʔε ▸ 2014೥9݄17೔ ਖ਼ࣜϦϦʔε ▸

    2014೥11݄1೔ daiksyೖࣾ ▸ 2016೥6݄10೔ 100ि࿈ଓϦϦʔε ▸ 2018೥7݄2೔ 200ि࿈ଓϦϦʔε WebαʔϏεʹͯ200ि࿈ଓͰ৽ػೳΛϦϦʔε͢Δ෣୆ཪ
  10. ࿈ଓϦϦʔε

  11. ࿈ଓϦϦʔε ▸ ϢʔβʔʹͱͬͯՁ஋ͷ͋ΔػೳΛຖिඞͣϦϦʔε͢Δ ▸ όάϑΟοΫε΍ϝϯςφϯεϦϦʔε͸ʮ࿈ଓϦϦʔεʯ ͷఆٛʹ͸ؚ·ͳ͍ ▸ ຖि݄༵೔ʢੲ͸ຖि༵ۚ೔ʣʹ৽ػೳͷ͓஌ΒͤΛϒϩά Ͱप஌ˍϝʔϦϯάϦετ഑৴ ▸

    ͨͩ͠೥຤೥࢝/ΰʔϧσϯ΢ΟʔΫ/͓ຍظؒ͸আ͘ʢզʑ ͸ϗϫΠτاۀͳͷͰ WebαʔϏεʹͯ200ि࿈ଓͰ৽ػೳΛϦϦʔε͢Δ෣୆ཪ
  12. ࿈ଓϦϦʔε WebαʔϏεʹͯ200ि࿈ଓͰ৽ػೳΛϦϦʔε͢Δ෣୆ཪ

  13. ͳΜͷͨΊʹ࿈ଓϦϦʔε Λ΍͍ͬͯͨͷ͔

  14. ▸ Mackerel͸ͱͯ΋ϛχϚϜͳঢ়ଶ͔Βελʔτͨ͠ ▸ Slack௨஌ -> ਖ਼ࣜϦϦʔεͷ2िؒޙ ▸ αʔϏεϝτϦοΫͷ؂ࢹ -> ਖ਼ࣜϦϦʔεͷ3ϲ݄ޙ

    ▸ ࠓͰ͸౰ͨΓલͷػೳͷ΄ͱΜͲ͸ະ࣮૷ͷঢ়ଶͰελʔ τ ͳͥʁ WebαʔϏεʹͯ200ि࿈ଓͰ৽ػೳΛϦϦʔε͢Δ෣୆ཪ
  15. ▸ ౰ॳ͸ػೳ։ൃͷεϐʔυײ͕ސ٬ʹରͯ͠໿ଋͰ͖Δ਺গ ͳ͍Ձ஋ͷͻͱͭͰ͋Γɺ༏Ґੑͩͬͨ ▸ ౰ॳ͸࿈ଓϦϦʔεΛҙ͍ࣝͯ͠ͳ͔͕ͬͨɺ͋Δ࣌਺͑ͨ Β50ि࿈ଓϦϦʔε໨લͩͬͨ ▸ ຖि࿈ଓϦϦʔεΛΞϐʔϧͨ͠ͱ͜Ζɺސ٬֫ಘͷେ͖ͳ ෢ثͱͳͬͨ ▸

    ·ͣ͸100िɺ࣍͸150िͱগͣͭ͠໨ඪΛ৳͹ͨ͠ ͳͥʁ WebαʔϏεʹͯ200ि࿈ଓͰ৽ػೳΛϦϦʔε͢Δ෣୆ཪ
  16. Ͳ͏΍ͬͯ ࿈ଓϦϦʔεΛҡ͔࣋ͨ͠

  17. Mackerel ͷγεςϜߏ੒ WebαʔϏεʹͯ200ि࿈ଓͰ৽ػೳΛϦϦʔε͢Δ෣୆ཪ

  18. Mackerel ͷϚΠΫϩαʔϏείϯϙʔωϯτ WebαʔϏεʹͯ200ि࿈ଓͰ৽ػೳΛϦϦʔε͢Δ෣୆ཪ

  19. Mackerel ͷϦϦʔεࠂ஌ର৅ൣғ ▸ mackerelຊମ ▸ WebγεςϜ ▸ ֎ܗ؂ࢹ, AWS, AzureͳͲͷΫϩʔϥ

    ▸ ҟৗݕ஌ίϯϙʔωϯτ ▸ ͸ͯͳࣾ಺ʹͯ։ൃ WebαʔϏεʹͯ200ि࿈ଓͰ৽ػೳΛϦϦʔε͢Δ෣୆ཪ
  20. ▸ OSS ▸ mackerel-agent ▸ mackerel-agent-plugins ▸ go-check-plugins ▸ mkr

    (CLIπʔϧ) ▸ ͸ͯͳࣾ಺Ͱͷ։ൃ + ϢʔβʔʹΑΔίϯτϦϏϡʔτ ▸ OSSͷΈͷϦϦʔε͸200࿈ଓϦϦʔεதʹ໿30ճ΄Ͳ Mackerel ͷϦϦʔεࠂ஌ର৅ൣғ WebαʔϏεʹͯ200ि࿈ଓͰ৽ػೳΛϦϦʔε͢Δ෣୆ཪ
  21. ▸ ϓϩμΫτΦʔφʔ ▸ σΟϨΫλʔ ← ΅͘͸͜͜ ▸ ΤϯδχΞ ▸ σβΠφ

    ▸ CRE ▸ ຋༁ ։ൃνʔϜͷମ੍ WebαʔϏεʹͯ200ि࿈ଓͰ৽ػೳΛϦϦʔε͢Δ෣୆ཪ
  22. ▸ ΤϯδχΞ ▸ 5 ~ 8໊ (಺1໊͕ςοΫϦʔυʣ ▸ σβΠφ ▸

    1ʙ2໊ ։ൃνʔϜͷମ੍ WebαʔϏεʹͯ200ि࿈ଓͰ৽ػೳΛϦϦʔε͢Δ෣୆ཪ
  23. ▸ ఆظϦϦʔε͸ि2ճ ▸ Րɾ໦ ▸ ϦϦʔε೔͕ॕલ೔ͷ৔߹͸ௐ੔ ։ൃνʔϜͷମ੍ WebαʔϏεʹͯ200ि࿈ଓͰ৽ػೳΛϦϦʔε͢Δ෣୆ཪ

  24. ։ൃνʔϜͷମ੍ staging؀ڥ PullRequest࡞੒ & ϨϏϡʔ ࣗಈςετOK -> staging؀ڥʹࣗಈ൓ө ຖिՐɾ໦ʹͦͷ࣌఺ͷstaging؀ڥͱͷࠩ෼͕ຊ൪൓ө͞ΕΔ WebαʔϏεʹͯ200ि࿈ଓͰ৽ػೳΛϦϦʔε͢Δ෣୆ཪ

  25. ▸ ि࣍౰൪ (ϩʔςʔγϣϯ) ▸ ϦϦʔε୲౰ (Ր) ▸ ϦϦʔε୲౰ (໦) ▸

    αϙʔτ୲౰ ▸ OSS܎ ։ൃνʔϜͷମ੍ WebαʔϏεʹͯ200ि࿈ଓͰ৽ػೳΛϦϦʔε͢Δ෣୆ཪ
  26. ▸ ि࣍౰൪ (ϩʔςʔγϣϯ) ▸ ϦϦʔε୲౰ ▸ ϦϦʔε࡞ۀͷओ୲౰ ▸ αϙʔτ୲౰ ▸

    Ϣʔβʔ͔Βͷ͓໰͍߹Θͤͷٕज़ௐࠪΛ୲౰ ▸ OSS܎ ▸ Ϣʔβʔ͔Βͷmackerel-agentͳͲ΁ͷPull Request, IssueΛݟΔ୲౰ ։ൃνʔϜͷମ੍ WebαʔϏεʹͯ200ि࿈ଓͰ৽ػೳΛϦϦʔε͢Δ෣୆ཪ
  27. ։ൃνʔϜͷମ੍ WebαʔϏεʹͯ200ि࿈ଓͰ৽ػೳΛϦϦʔε͢Δ෣୆ཪ

  28. ▸ staging؀ڥͰͷಈ࡞֬ೝ ▸ ֤छϝτϦοΫɾΤϥʔϩάͳͲͷ؍࡯ ▸ ຊ൪؀ڥʹσϓϩΠ ▸ ຊ൪؀ڥͰͷಈ࡞֬ೝ ▸ ֤छϝτϦοΫͷ؍࡯ɾΤϥʔϩάͳͲͷ؍࡯

    ▸ ҟৗ͕͋Ε͹ϩʔϧόοΫ͢Δ ▸ શମͷॴཁ࣌ؒ͸2࣌ؒ΄Ͳ ϦϦʔεखॱ WebαʔϏεʹͯ200ि࿈ଓͰ৽ػೳΛϦϦʔε͢Δ෣୆ཪ
  29. ▸ 2िؒεϓϦϯτͷεΫϥϜܗࣜ(มଇత) ▸ εϓϦϯτܭը ▸ ։ൃ ▸ Րɾ໦ʹఆظϦϦʔε ▸ ݄༵೔ʹࠂ஌

    ▸ 2िؒͷ࠷ޙͷ༵ۚ೔ʹৼΓฦΓ ։ൃͷϦζϜ WebαʔϏεʹͯ200ि࿈ଓͰ৽ػೳΛϦϦʔε͢Δ෣୆ཪ
  30. ▸ ϓϩμΫτΦʔφ͕࡞੒͢Δதɾ௕ظͷϩʔυϚοϓ ▸ 3೥ͷ௕ظϩʔυϚοϓ ▸ ࢛൒ظ͝ͱͷதظϩʔυϚοϓ ▸ CREʹΑΔϢʔβʔώΞϦϯάɻαϙʔτʹدͤΒΕΔཁ๬ ▸ ΤϯδχΞ͔ΒϘτϜΞοϓͰఏҊ͞ΕΔվળʢΞϓϦέʔ

    γϣϯϑϨʔϜϫʔΫ΍ϛυϧ΢ΣΞͷόʔδϣϯΞοϓͳ Ͳʣ ܭը ʢ։ൃͷΠϯϓοτʣ WebαʔϏεʹͯ200ि࿈ଓͰ৽ػೳΛϦϦʔε͢Δ෣୆ཪ
  31. ▸ ௕ظλεΫ ▸ ։ൃʹ௕͍ظؒΛཁ͢Δ։ൃλεΫ (਺ϲ݄~1೥) ▸ ࠷ۙͩͱҟৗݕ஌ػೳ, ίϯςφରԠͳͲ͕͜Εʹ֘౰ ▸ ओ୲౰ΤϯδχΞΛΞαΠϯ͠ɺϓϩδΣΫτԽ

    ▸ ௕ظλεΫ΋ࡉ͔͍୯ҐͰϓϧϦΫΤετ͕࡞ΒΕͯɺຖिϚʔδ & ϦϦʔ ε͞Ε͍ͯ·͢ ▸ ୹ظλεΫ ▸ 1εϓϦϯτ಺(਺೔)Ͱ։ൃ͕ऴΘΔλεΫ ܭը ʢ։ൃλεΫͷ෼ྨʣ WebαʔϏεʹͯ200ि࿈ଓͰ৽ػೳΛϦϦʔε͢Δ෣୆ཪ
  32. ▸ ݄: ΞαΠϯ͞Ε͍ͯΔ௕ظλεΫΛਐΊΔ ▸ Ր: ޕલ: ϦϦʔε౰൪, ޕޙ: ௕ظλεΫΛਐΊΔ ▸

    ਫ: ޕલ: ৽ϝϯόʔͱϖΞϓϩ, ޕޙ: ௕ظλεΫΛਐΊΔ ▸ ໦: དྷिࠂ஌༧ఆͷ୹ظλεΫΛਐΊΔ ▸ ۚ: ޕલ: 1࣌ؒ΄ͲͰऴΘΓͦ͏ͳόάमਖ਼Λ΍Δ, ޕޙ: ։ ൃݴޠͷόʔδϣϯΞοϓʹνϟϨϯδͯ͠ΈΔ ͱ͋ΔΤϯδχΞͷ1िؒͷ༷ࢠ WebαʔϏεʹͯ200ि࿈ଓͰ৽ػೳΛϦϦʔε͢Δ෣୆ཪ
  33. ▸ όοΫϩάʹରͯ͠ΤϯδχΞͷ100%ՔಇΛٻΊͳ͍ ▸ ͍͍ͩͨ20~30%͘Β͍͸༨ྗ͕࢒ΔΑ͏ʹܭը͢Δ ▸ ٕज़తෛ࠴ͷฦࡁͳͲɺΤϯδχΞ͕ࣗओతʹऔΓ૊Ί Δ׆ಈͷ༨஍Λ࢒͓ͯ͘͠ ▸ ༨ྗͰ͜ͳͨ͠খ͞ͳλεΫ͕ɺຖिࠂ஌ͷ༗༻ͳωλʹͳ Δͱ͖΋͋Δ

    ։ൃܭըͷϙΠϯτ WebαʔϏεʹͯ200ि࿈ଓͰ৽ػೳΛϦϦʔε͢Δ෣୆ཪ
  34. ▸ ϚΠΫϩϚωδϝϯτ͸ઈରͩΊ ▸ ΨνΨνʹܭըͯ͠͠·͏ͱɺ͔͑ͬͯ਎ಈ͖͕औΕͳ͘ͳ Δ ▸ ࣗ཯ͨ͠νʔϜΛ࡞ΔͨΊʹ͸ԿΑΓ΋༨ྗ͕ඞཁ ։ൃܭըͷϙΠϯτ WebαʔϏεʹͯ200ि࿈ଓͰ৽ػೳΛϦϦʔε͢Δ෣୆ཪ

  35. ▸ ௕͘։ൃ͍ͯ͠Δͱɺҟಈɾୀ৬ͳͲͰϝϯόʔ͸͚ͬ͜͏ ೖΕସΘΔ ▸ ि୯ҐͰϦϦʔεΛܧଓ͍ͯ͠ΔͱɺϝϯόʔೖΕସ͑ʹΑ Δҡ࣋తͳઓྗͷ௿Լ΋͚ͬ͜͏ӨڹΛड͚Δ ▸ ޮ཰Α͘։ൃ͢ΔͨΊʹɺϝϯόʔͷಘखɾෆಘखΛ೺Ѳ͠ ͓ͯ͘ͷ͸ॏཁ ϝϯόʔͷೖΕସΘΓ

    WebαʔϏεʹͯ200ि࿈ଓͰ৽ػೳΛϦϦʔε͢Δ෣୆ཪ
  36. εΩϧϚοϓ WebαʔϏεʹͯ200ि࿈ଓͰ৽ػೳΛϦϦʔε͢Δ෣୆ཪ

  37. ▸ νʔϜ͕ҡ࣋͢΂͖εΩϧͷՄࢹԽ ▸ ҟಈ΍ୀ৬ʹΑͬͯಛఆͷεΩϧ͕஌ΒͣʹࣦΘΕΔͱ͍͏ ͜ͱ͕ͳ͍ ▸ νʔϜͷεΩϧόϥϯεΛ೺Ѳ͢Δ͜ͱͰɺޮ཰తͳ։ൃΛ ܭը͢Δ͜ͱ͕Ͱ͖Δ εΩϧϚοϓ WebαʔϏεʹͯ200ि࿈ଓͰ৽ػೳΛϦϦʔε͢Δ෣୆ཪ

  38. ▸ ຖिࠂ஌ΛνʔϜͷ࠷ॏཁίϛοτϝϯτͱҐஔ͚ͮɺνʔϜશһ͕ͦ ΕΛ໨ࢦͯ͠ຖ೔࢓ࣄΛ͢Δ ▸ ͍͟ͱ͍͏ͱ͖ʹඋ͑ͯɺ1೔, 2೔͘Β͍Ͱ࣮૷Ͱ͖ͦ͏ͳ༏ઌ౓͕ͦ Ε΄Ͳߴ͘ͳ͍λεΫΛ͍͔ͭ͘ετοΫ͓ͯ͘͠ ▸ ίϛϡχςΟͷखॿ͚ΊͪΌͪ͘Ό͋Γ͕͍ͨͰ͢… (OSS΁ͷίϯτ

    ϦϏϡʔτ) ▸ ͚ͩ͜͜ͷ࿩ɺ࣮૷͸ऴΘ͍ͬͯΔ͚Ͳདྷिͷωλ͕ͳ͍͔Β·ͩϦϦʔ ε͠ͳ͍Ͱ͓͜͏ɺͱ͍͏͜ͱ΋ͯ͠·ͨ͠ʢ࡞Γஔ͖ͱݺΜͰ͍ͨ ຖिϦϦʔεΛܧଓ͢Δίπ WebαʔϏεʹͯ200ि࿈ଓͰ৽ػೳΛϦϦʔε͢Δ෣୆ཪ
  39. 200िΛ۠੾Γʹ ࿈ଓϦϦʔεΛ΍Ί·͢

  40. ▸ ϓϩμΫτͱͯ͠ɺओཁͳػೳ͕ग़ἧͬͨ ▸ ॳ୅ϓϩμΫτΦʔφʔͷߏ૝ͨ͠ػೳΛ͋Β͔࣮ͨ૷͠ ऴ͑ͨ ▸ εϐʔυײ΋େ੾͕ͩɺࠊΛਾ͑ͨػೳ։ൃͷํ͕ސ٬ʹͱͬ ͯେ͖ͳՁ஋ʹͳΔϑΣʔζʹདྷͨͱ൑அ ▸ ελʔτΞοϓظͷऴྃ

    ͳͥຖिϦϦʔεΛࢭΊͨͷʁ WebαʔϏεʹͯ200ि࿈ଓͰ৽ػೳΛϦϦʔε͢Δ෣୆ཪ
  41. ▸ ଍ճΓͷվળ͕΍Γ΍͘͢ͳͬͨ ▸ Playframework, Scala, sbtͷόʔδϣϯ͕Ұؾʹ৽͘͠ ͳͬͨ ▸ νʔϜʹ·ͩຖिϦϦʔεͷهԱ͕࢒͍ͬͯΔͷͰɺεϐʔ υײΛҡ࣋ͭͭ͠ࠊΛਾ͑ͨ։ൃ͕Ͱ͖Δ

    ▸ 1८ͯ͠ʮຖिϦϦʔεΛ΍Βͳ͍ͷ͕౰ͨΓલʯʹͳͬͨ ͱ͖ʹͲ͏ͳΔ͔ͳʁ ຖिϦϦʔεΛऴ͑ͯΈͯ WebαʔϏεʹͯ200ि࿈ଓͰ৽ػೳΛϦϦʔε͢Δ෣୆ཪ
  42. ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ WebαʔϏεʹͯ200ि࿈ଓͰ৽ػೳΛϦϦʔε͢Δ෣୆ཪ