$30 off During Our Annual Pro Sale. View Details »

新機能作成時に開発ブランチに細かくmergeしていく戦略/merge-strategy-for-new-feature

shibayu36
August 07, 2017

 新機能作成時に開発ブランチに細かくmergeしていく戦略/merge-strategy-for-new-feature

shibayu36

August 07, 2017
Tweet

More Decks by shibayu36

Other Decks in Programming

Transcript

  1. ৽ػೳ࡞੒࣌ʹ։ൃϒϥϯν
    ʹࡉ͔͘merge͍ͯ͘͠ઓུ
    ࣾ಺ٕज़ษڧձ 2017/08/03
    id:shiba_yu36

    View Slide

  2. ࠷ۙ͸େ͖Ίͳ৽ػೳΛ࡞Δ࣌ɺ
    ։ൃϒϥϯνʹࡉ͔͘merge͢
    ΔઓུΛ࢖͍ͬͯΔͷͰ঺հ

    View Slide

  3. جຊతͳઓུ
    • Ϣʔβʔʹ৽ػೳ͕ݟ͑ͳ͍Α͏ʹ͢Δ޻෉Λ͠ɺ
    ৽ػೳͷbranch΋ͲΜͲΜmerge͍ͯ͘͠
    • PR͸ՄೳͳݶΓࡉ͔͘
    • ࠷ޙʹϢʔβʔʹ৽ػೳΛݟ͑ΔΑ͏ͳϦϦʔεΛ
    ͢Δ

    View Slide

  4. Πϝʔδ
    NBTUFS
    EFWFMPQ
    G
    SFMFBTF
    G G
    ࠷ऴSFMFBTF

    View Slide

  5. ͍ΖΜͳࣦഊ͔Β
    ͜ͷઓུʹࢸͬͨ

    View Slide

  6. Α͋͘Δࣦഊύλʔϯͦͷ1
    ڊେPRύλʔϯ

    View Slide

  7. ڊେPRύλʔϯ
    • ৽ػೳͷͨΊͷίʔυΛҰͭͷPRʹ·ͱΊͯ
    mergeͯ͠ϦϦʔε
    GCJHCBOH
    EFWFMPQ


    View Slide

  8. ࠔΔ͜ͱ
    • ௒ίϯϑϦΫτ໰୊
    • ϨϏϡʔ͢Δ؍఺͕ଟ͗ͯ͢ݟམͱ͢ -> ҆ఆੑ×
    • ࢦఠ͕ଟ͘ͳΓ͕ͪ -> ϨϏϡʔ͞ΕΔଆ͕ർฐ
    • ϨϏϡʔͷԠुͰർฐ͢Δ -> Ͳͬͪ΋ਏ͍

    View Slide

  9. ײ֮తʹ500ߦ
    ௒͖͑ͯͨลΓͰਏ͍

    View Slide

  10. Α͋͘Δࣦഊύλʔϯͦͷ2
    ৽ػೳϦϦʔεϒϥϯνύλʔϯ

    View Slide

  11. ৽ػೳϦϦʔεϒϥϯν
    • ৽ػೳͷϦϦʔε༻ϒϥϯνΛҰͭ༻ҙͯ͠ɺͦ͜
    ʹPRΛૹΔύλʔϯ
    • PR͸ࡉ͔͘ϨϏϡʔ͞ΕɺϦϦʔε༻ϒϥϯν΁

    View Slide

  12. GSFMFBTF
    EFWFMPQ
    G G

    View Slide

  13. ࠔΔ͜ͱ
    • ௒ίϯϑϦΫτ໰୊࠶ͼ
    • ࠷ޙʹϦϦʔεPRΛશνΣοΫ͠ͳ͍ͱ҆৺Ͱ
    ͖ͳ͍
    • ଞͷػೳͰඞཁʹͳͬͨϝιουΛcherry-pick
    ͠·͘Δ

    View Slide

  14. ࠔΔ͜ͱ
    • ௒ίϯϑϦΫτ໰୊࠶ͼ
    • ࠷ޙʹϦϦʔεPRΛશνΣοΫ͠ͳ͍ͱ҆৺Ͱ
    ͖ͳ͍
    • ଞͷػೳͰඞཁʹͳͬͨϝιουΛcherry-pick
    ͠·͘Δ
    ಛʹ͜Ε͕΍͹͍

    View Slide

  15. • feature1Ͱfind_hoge_blogͱ͍͏ϝιουΛ࡞Δ
    • feature2Ͱ΋ಉ͡ϝιουΛ࢖͏͜ͱʹͳͬͨ
    • find_hoge_blogΛ࡞ͬͨcommitΛcherry-pick͢
    Δ?
    • ͔ͦ͠͠ͷcommitΛcherry-pick͢Δͱมͳίʔ
    υ΋ฆΕͯ͘Δ
    • ίϐϖ͢Δ͔͠ͳ͍ʁʁʁ

    View Slide

  16. ͍͍ײ͡ʹ΍Δํ๏΋͋Γ
    ͦ͏͚ͩͲɺͱʹ͔͘େม

    View Slide

  17. ͜ͷΑ͏ͳࣦഊ͔Β
    ࠷ॳͷઓུΛऔΔΑ͏ʹ

    View Slide

  18. (࠶ܝ)جຊతͳઓུ
    • Ϣʔβʔʹ৽ػೳ͕ݟ͑ͳ͍Α͏ʹ͢Δ޻෉Λ͠ɺ
    ৽ػೳͷbranch΋ͲΜͲΜmerge͍ͯ͘͠
    • PR͸ՄೳͳݶΓࡉ͔͘
    • ࠷ޙʹϢʔβʔʹ৽ػೳΛݟ͑ΔΑ͏ͳϦϦʔεΛ
    ͢Δ

    View Slide

  19. (࠶ܝ)جຊతͳઓུ
    • Ϣʔβʔʹ৽ػೳ͕ݟ͑ͳ͍Α͏ʹ͢Δ޻෉Λ͠ɺ
    ৽ػೳͷbranch΋ͲΜͲΜmerge͍ͯ͘͠
    • PR͸ՄೳͳݶΓࡉ͔͘
    • ࠷ޙʹϢʔβʔʹ৽ػೳΛݟ͑ΔΑ͏ͳϦϦʔεΛ
    ͢Δ

    View Slide

  20. ύλʔϯ
    • ϩδοΫͷϝιου͔Β࡞Δ
    • Ϣʔβʔʹݟ͑ͳ͍෦෼͔Β࡞Δ
    • ΤϯυϙΠϯτΛຊ൪Ͱ͸ݟ͑ͳ͍Α͏ʹ͢Δ
    • Ұ෦ͷHTML͚ͩຊ൪Ͱ͸Ӆ͓ͯ͘͠
    • ϦχϡʔΞϧύλʔϯ

    View Slide

  21. ύλʔϯ1
    ϩδοΫͷϝιου͔Β࡞Δ

    View Slide

  22. • Logic::Blog->find_public_blogsͱ͔ɺLogic::Blog-
    >createͱ͔͚ͩ࡞ͬͯPR
    • ϩδοΫΛϢʔβʔʹݟ͑ΔControllerͱ͔Ͱ࢖Θ
    ͳ͚Ε͹౰વӨڹͳ͠

    View Slide

  23. ஫ҙ
    • ϢʔεέʔεΛ෼ੳ͓͔ͯ͠ͳ͍ͱɺ࣮ࡍʹ࢖͏࣌
    ʹ࢖͑ͳ͍͜ͱʹؾͮ͘
    • ࢖͍ํٖࣅίʔυΛॻ͖ͭͭɺͦΕ΋߹ΘͤͯϨ
    Ϗϡʔͯ͠΋Β͏ͱྑ͍

    View Slide

  24. sub endpoint {
    my ($req, $res) = @_;
    # λΠτϧͱઆ໌จΛrequest͔Β
    # ͜͜Ͱvalidate΋͢Δ
    my ($title, $desc) = validate(
    title => $req->param('title'),
    desc => $req->param('desc'),
    );
    # titleͱdescriptionΛ౉͢
    Logic::Blog->create(...)
    }

    View Slide

  25. ύλʔϯ2
    Ϣʔβʔʹݟ͑ͳ͍෦෼͔Β࡞Δ

    View Slide

  26. ྫ)
    MySQLͷLIKEݕࡧ͔ΒɺElasticsearch
    ʹஔ͖׵͑ͯࣗ༝ͳιʔτ΋ར༻Մೳʹ

    View Slide

  27. ෼ׂ͢Δ
    1. Elasticsearchͷ։ൃ؀ڥ࡞Γ(खݩɺ։ൃ؀ڥɺຊ൪)
    2. ݕࡧ͍ͨ͠σʔλͷElasticsearch΁ͷಉظ
    3. ݕࡧΫΤϦͰͷݕࡧཪଆΛMySQL͔ΒElasticsearchʹ
    ஔ͖׵͑
    4. ElasticsearchΛ࢖ͬͯιʔτΛ࣮૷

    View Slide

  28. 3൪·Ͱ͸Ϣʔβʔ͔Β͸ݟ͑
    ͳ͍ͷͰɺਵ࣌ϦϦʔεՄೳ

    View Slide

  29. ෼ׂ͢Δ
    1. Elasticsearchͷ։ൃ؀ڥ࡞Γ(खݩɺ։ൃ؀ڥɺຊ൪)
    2. ݕࡧ͍ͨ͠σʔλͷElasticsearch΁ͷಉظ
    3. ݕࡧΫΤϦͰͷݕࡧཪଆΛMySQL͔ΒElasticsearch
    ʹஔ͖׵͑
    4. ElasticsearchΛ࢖ͬͯιʔτΛ࣮૷

    View Slide

  30. ύλʔϯ3
    ΤϯυϙΠϯτΛຊ൪Ͱ͸
    ݟ͑ͳ͍Α͏ʹ

    View Slide

  31. ༻్
    • ৽ػೳΛಛఆͷURLͰఏڙ͢Δ࣌ʹ
    ࢖͑Δ

    View Slide

  32. ΍Γํ
    • ։ൃ؀ڥͰ͸URLͰͦͷػೳʹΞΫηε
    Ͱ͖ΔΑ͏ʹ
    • ຊ൪؀ڥͰ͸Not Foundʹ͢Δ
    • ୯ͳΔϑϥά͚ͩͰ࣮૷Մೳ

    View Slide

  33. # /feature1ͰΞΫηεͰ͖ΔΤϯυϙΠϯτ
    sub feature1 {
    my ($req, $res) = @_;
    # ։ൃ؀ڥͰͷΈONʹͳΔϑϥά
    # TODO(feature1_release): ϦϦʔεલʹফ͢
    if (!$ENV{CAN_SHOW_NEW_FEATURE}) {
    return $res->not_found;
    }
    ...
    }

    View Slide

  34. ϑϥά͸؀ڥม਺Ͱ΋
    Config::ENVతͳ΋ͷ࢖͏ͷͰ
    ΋ͳΜͰ΋

    View Slide

  35. ׬੒ͨ͠ΒϑϥάΛ࢖ͬͨif
    จΛফͨ͠ΒϦϦʔεͰ͖Δ

    View Slide

  36. ύλʔϯ4
    Ұ෦ͷHTML͚ͩຊ൪Ͱ͸
    Ӆ͓ͯ͘͠

    View Slide

  37. ༻్
    • ͋ΔϖʔδͷҰ෦ʹ৽ػೳ௥Ճ
    ͢Δ࣌

    View Slide

  38. ΍Γํ
    • ςϯϓϨʔτΤϯδϯΛ࢖͍ͬͯΔ
    ͱ؆୯
    • ϑϥάΛςϯϓϨʔτʹ౉ͯ͠ɺಛఆ
    HTMLΛফͨ͠Γ͢Δ͚ͩ

    View Slide

  39. ...
    [%- IF can_show_new_feature %]

    ...

    [%- END %]
    ...

    View Slide

  40. JSͱ͔΋ཁૉ͕͋Δ࣌ͷ
    Έ༗ޮʹ͢ΔͷͰରॲՄೳ

    View Slide

  41. ׬੒ͨ͠ΒϑϥάΛ࢖ͬͨif
    จΛফͨ͠ΒϦϦʔεͰ͖Δ

    View Slide

  42. ύλʔϯ5
    ϦχϡʔΞϧύλʔϯ

    View Slide

  43. ༻్
    • ৽ػೳͰϖʔδ͕ΨϥοͱมΘΓɺ
    ಛఆHTMLΛӅ͢ͱ͔Ͱରॲෆೳͳ࣌

    View Slide

  44. ΍Γํ
    • ίϯτϩʔϥͱςϯϓϨʔτͷηοτΛ
    ΋͏1ͭ༻ҙ͢Δ
    • ৽͍͠ίϯτϩʔϥ͸ຊ൪Ͱ͸ݟ͑ͳ͍
    Α͏ʹ
    • ࠷ޙʹલͷ΍ͭͱͦͬ͝ͱೖΕସ͑Δ

    View Slide

  45. # /feature1_renewalͰΞΫηεͰ͖ΔΤϯυϙΠϯτ
    sub feature1_renewal {
    my ($req, $res) = @_;
    # ։ൃ؀ڥͰͷΈONʹͳΔϑϥά
    # TODO(feature1_release): ϦϦʔεલʹফ͢
    if (!$ENV{CAN_SHOW_NEW_FEATURE}) {
    return $res->not_found;
    }
    ...
    }

    View Slide

  46. feature1_renewal.html
    lessͱ͔JSͱ͔͸͍͍ײ͡ʹ

    View Slide

  47. • sub feature1_renewal -> sub feature1
    • feature1_renewal.html -> feature1.html
    • lessͱ͔΋ҰؾʹҠಈ
    • ࠷ޙ͚ͩͪΐͬͱେมͰ͸͋Δ

    View Slide

  48. ·ͱΊ
    • େ͖Ίͳ৽ػೳ࡞Γͷ࣌ͷmergeઓུʹͭ
    ͍ͯͷ࿩
    • ࣦഊܦݧ͔ΒϢʔβʔʹݟ͑ͳ͍Α͏ʹͲ
    ΜͲΜ։ൃϒϥϯνʹmerge͢ΔΑ͏ʹ
    ͳͬͨ
    • ݟ͑ͳ͍Α͏ʹ͢Δύλʔϯ͸͍Ζ͍Ζ

    View Slide