৽ػೳ࡞࣌ʹ։ൃϒϥϯνʹࡉ͔͘merge͍ͯ͘͠ઓུٕࣾज़ษڧձ 2017/08/03id:shiba_yu36
View Slide
࠷ۙେ͖Ίͳ৽ػೳΛ࡞Δ࣌ɺ։ൃϒϥϯνʹࡉ͔͘merge͢ΔઓུΛ͍ͬͯΔͷͰհ
جຊతͳઓུ• Ϣʔβʔʹ৽ػೳ͕ݟ͑ͳ͍Α͏ʹ͢ΔΛ͠ɺ৽ػೳͷbranchͲΜͲΜmerge͍ͯ͘͠• PRՄೳͳݶΓࡉ͔͘• ࠷ޙʹϢʔβʔʹ৽ػೳΛݟ͑ΔΑ͏ͳϦϦʔεΛ͢Δ
ΠϝʔδNBTUFSEFWFMPQGSFMFBTFG G࠷ऴSFMFBTF
͍ΖΜͳࣦഊ͔Β͜ͷઓུʹࢸͬͨ
Α͋͘Δࣦഊύλʔϯͦͷ1ڊେPRύλʔϯ
ڊେPRύλʔϯ• ৽ػೳͷͨΊͷίʔυΛҰͭͷPRʹ·ͱΊͯmergeͯ͠ϦϦʔεGCJHCBOHEFWFMPQ
ࠔΔ͜ͱ• ίϯϑϦΫτ• ϨϏϡʔ͢Δ؍͕ଟ͗ͯ͢ݟམͱ͢ -> ҆ఆੑו ࢦఠ͕ଟ͘ͳΓ͕ͪ -> ϨϏϡʔ͞ΕΔଆ͕ർฐ• ϨϏϡʔͷԠुͰർฐ͢Δ -> Ͳͬͪਏ͍
ײ֮తʹ500ߦ͖͑ͯͨลΓͰਏ͍
Α͋͘Δࣦഊύλʔϯͦͷ2৽ػೳϦϦʔεϒϥϯνύλʔϯ
৽ػೳϦϦʔεϒϥϯν• ৽ػೳͷϦϦʔε༻ϒϥϯνΛҰͭ༻ҙͯ͠ɺͦ͜ʹPRΛૹΔύλʔϯ• PRࡉ͔͘ϨϏϡʔ͞ΕɺϦϦʔε༻ϒϥϯν
GSFMFBTFEFWFMPQG G
ࠔΔ͜ͱ• ίϯϑϦΫτ࠶ͼ• ࠷ޙʹϦϦʔεPRΛશνΣοΫ͠ͳ͍ͱ҆৺Ͱ͖ͳ͍• ଞͷػೳͰඞཁʹͳͬͨϝιουΛcherry-pick͠·͘Δ
ࠔΔ͜ͱ• ίϯϑϦΫτ࠶ͼ• ࠷ޙʹϦϦʔεPRΛશνΣοΫ͠ͳ͍ͱ҆৺Ͱ͖ͳ͍• ଞͷػೳͰඞཁʹͳͬͨϝιουΛcherry-pick͠·͘Δಛʹ͜Ε͕͍
• feature1Ͱfind_hoge_blogͱ͍͏ϝιουΛ࡞Δ• feature2Ͱಉ͡ϝιουΛ͏͜ͱʹͳͬͨ• find_hoge_blogΛ࡞ͬͨcommitΛcherry-pick͢Δ?• ͔ͦ͠͠ͷcommitΛcherry-pick͢ΔͱมͳίʔυฆΕͯ͘Δ• ίϐϖ͢Δ͔͠ͳ͍ʁʁʁ
͍͍ײ͡ʹΔํ๏͋Γͦ͏͚ͩͲɺͱʹ͔͘େม
͜ͷΑ͏ͳࣦഊ͔Β࠷ॳͷઓུΛऔΔΑ͏ʹ
(࠶ܝ)جຊతͳઓུ• Ϣʔβʔʹ৽ػೳ͕ݟ͑ͳ͍Α͏ʹ͢ΔΛ͠ɺ৽ػೳͷbranchͲΜͲΜmerge͍ͯ͘͠• PRՄೳͳݶΓࡉ͔͘• ࠷ޙʹϢʔβʔʹ৽ػೳΛݟ͑ΔΑ͏ͳϦϦʔεΛ͢Δ
ύλʔϯ• ϩδοΫͷϝιου͔Β࡞Δ• Ϣʔβʔʹݟ͑ͳ͍෦͔Β࡞Δ• ΤϯυϙΠϯτΛຊ൪Ͱݟ͑ͳ͍Α͏ʹ͢Δ• Ұ෦ͷHTML͚ͩຊ൪ͰӅ͓ͯ͘͠• ϦχϡʔΞϧύλʔϯ
ύλʔϯ1ϩδοΫͷϝιου͔Β࡞Δ
• Logic::Blog->find_public_blogsͱ͔ɺLogic::Blog->createͱ͔͚ͩ࡞ͬͯPR• ϩδοΫΛϢʔβʔʹݟ͑ΔControllerͱ͔ͰΘͳ͚ΕવӨڹͳ͠
ҙ• ϢʔεέʔεΛੳ͓͔ͯ͠ͳ͍ͱɺ࣮ࡍʹ͏࣌ʹ͑ͳ͍͜ͱʹؾͮ͘• ͍ํٖࣅίʔυΛॻ͖ͭͭɺͦΕ߹ΘͤͯϨϏϡʔͯ͠Β͏ͱྑ͍
sub endpoint {my ($req, $res) = @_;# λΠτϧͱઆ໌จΛrequest͔Β# ͜͜Ͱvalidate͢Δmy ($title, $desc) = validate(title => $req->param('title'),desc => $req->param('desc'),);# titleͱdescriptionΛ͢Logic::Blog->create(...)}
ύλʔϯ2Ϣʔβʔʹݟ͑ͳ͍෦͔Β࡞Δ
ྫ)MySQLͷLIKEݕࡧ͔ΒɺElasticsearchʹஔ͖͑ͯࣗ༝ͳιʔτར༻Մೳʹ
ׂ͢Δ1. Elasticsearchͷ։ൃڥ࡞Γ(खݩɺ։ൃڥɺຊ൪)2. ݕࡧ͍ͨ͠σʔλͷElasticsearchͷಉظ3. ݕࡧΫΤϦͰͷݕࡧཪଆΛMySQL͔ΒElasticsearchʹஔ͖͑4. ElasticsearchΛͬͯιʔτΛ࣮
3൪·ͰϢʔβʔ͔Βݟ͑ͳ͍ͷͰɺਵ࣌ϦϦʔεՄೳ
ύλʔϯ3ΤϯυϙΠϯτΛຊ൪Ͱݟ͑ͳ͍Α͏ʹ
༻్• ৽ػೳΛಛఆͷURLͰఏڙ͢Δ࣌ʹ͑Δ
Γํ• ։ൃڥͰURLͰͦͷػೳʹΞΫηεͰ͖ΔΑ͏ʹ• ຊ൪ڥͰNot Foundʹ͢Δ• ୯ͳΔϑϥά͚ͩͰ࣮Մೳ
# /feature1ͰΞΫηεͰ͖ΔΤϯυϙΠϯτsub feature1 {my ($req, $res) = @_;# ։ൃڥͰͷΈONʹͳΔϑϥά# TODO(feature1_release): ϦϦʔεલʹফ͢if (!$ENV{CAN_SHOW_NEW_FEATURE}) {return $res->not_found;}...}
ϑϥάڥมͰConfig::ENVతͳͷ͏ͷͰͳΜͰ
ͨ͠ΒϑϥάΛͬͨifจΛফͨ͠ΒϦϦʔεͰ͖Δ
ύλʔϯ4Ұ෦ͷHTML͚ͩຊ൪ͰӅ͓ͯ͘͠
༻్• ͋ΔϖʔδͷҰ෦ʹ৽ػೳՃ͢Δ࣌
Γํ• ςϯϓϨʔτΤϯδϯΛ͍ͬͯΔͱ؆୯• ϑϥάΛςϯϓϨʔτʹͯ͠ɺಛఆHTMLΛফͨ͠Γ͢Δ͚ͩ
...[%- IF can_show_new_feature %]...[%- END %]...
JSͱ͔ཁૉ͕͋Δ࣌ͷΈ༗ޮʹ͢ΔͷͰରॲՄೳ
ύλʔϯ5ϦχϡʔΞϧύλʔϯ
༻్• ৽ػೳͰϖʔδ͕ΨϥοͱมΘΓɺಛఆHTMLΛӅ͢ͱ͔Ͱରॲෆೳͳ࣌
Γํ• ίϯτϩʔϥͱςϯϓϨʔτͷηοτΛ͏1ͭ༻ҙ͢Δ• ৽͍͠ίϯτϩʔϥຊ൪Ͱݟ͑ͳ͍Α͏ʹ• ࠷ޙʹલͷͭͱͦͬ͝ͱೖΕସ͑Δ
# /feature1_renewalͰΞΫηεͰ͖ΔΤϯυϙΠϯτsub feature1_renewal {my ($req, $res) = @_;# ։ൃڥͰͷΈONʹͳΔϑϥά# TODO(feature1_release): ϦϦʔεલʹফ͢if (!$ENV{CAN_SHOW_NEW_FEATURE}) {return $res->not_found;}...}
feature1_renewal.htmllessͱ͔JSͱ͔͍͍ײ͡ʹ
• sub feature1_renewal -> sub feature1• feature1_renewal.html -> feature1.html• lessͱ͔ҰؾʹҠಈ• ࠷ޙ͚ͩͪΐͬͱେมͰ͋Δ
·ͱΊ• େ͖Ίͳ৽ػೳ࡞Γͷ࣌ͷmergeઓུʹ͍ͭͯͷ• ࣦഊܦݧ͔ΒϢʔβʔʹݟ͑ͳ͍Α͏ʹͲΜͲΜ։ൃϒϥϯνʹmerge͢ΔΑ͏ʹͳͬͨ• ݟ͑ͳ͍Α͏ʹ͢Δύλʔϯ͍Ζ͍Ζ