Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
新機能作成時に開発ブランチに細かくmergeしていく戦略/merge-strategy-for...
Search
shibayu36
August 07, 2017
Programming
6
18k
新機能作成時に開発ブランチに細かくmergeしていく戦略/merge-strategy-for-new-feature
shibayu36
August 07, 2017
Tweet
Share
More Decks by shibayu36
See All by shibayu36
EMこそClaude Codeでコード調査しよう
shibayu36
0
1k
詳しくない分野でのVibe Codingで困ったことと学び/vibe-coding-in-unfamiliar-area
shibayu36
3
5.6k
個人CLAUDE.md紹介と設定から学んだこと/introduce-my-claude-md
shibayu36
0
930
今の生産性改善活動で大切にしている考え方
shibayu36
8
8.7k
エンジニアメンター制度の効果的な運用を目指して/improve-mentor-system
shibayu36
27
10k
グレードイメージ具体化のため昇格理由を公開する
shibayu36
8
5.9k
一から始めるJavaScriptユニットテスト/js-unit-test-from-scratch
shibayu36
8
33k
技術ブログを書くことについて/writing-tech-blog
shibayu36
17
27k
はてなと技術研修
shibayu36
1
6.5k
Other Decks in Programming
See All in Programming
Combinatorial Interview Problems with Backtracking Solutions - From Imperative Procedural Programming to Declarative Functional Programming - Part 2
philipschwarz
PRO
0
110
Claude Codeの「Compacting Conversation」を体感50%減! CLAUDE.md + 8 Skills で挑むコンテキスト管理術
kmurahama
1
620
愛される翻訳の秘訣
kishikawakatsumi
3
340
クラウドに依存しないS3を使った開発術
simesaba80
0
150
Cell-Based Architecture
larchanjo
0
140
ZJIT: The Ruby 4 JIT Compiler / Ruby Release 30th Anniversary Party
k0kubun
0
250
Findy AI+の開発、運用におけるMCP活用事例
starfish719
0
1.7k
The Art of Re-Architecture - Droidcon India 2025
siddroid
0
120
生成AI時代を勝ち抜くエンジニア組織マネジメント
coconala_engineer
0
370
Rubyで鍛える仕組み化プロヂュース力
muryoimpl
0
150
DevFest Android in Korea 2025 - 개발자 커뮤니티를 통해 얻는 가치
wisemuji
0
170
Navigation 3: 적응형 UI를 위한 앱 탐색
fornewid
1
440
Featured
See All Featured
Raft: Consensus for Rubyists
vanstee
141
7.2k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.2k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
The Cost Of JavaScript in 2023
addyosmani
55
9.4k
Principles of Awesome APIs and How to Build Them.
keavy
127
17k
Between Models and Reality
mayunak
0
150
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
400
Designing Experiences People Love
moore
143
24k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
310
Stop Working from a Prison Cell
hatefulcrawdad
273
21k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
1.7k
Transcript
৽ػೳ࡞࣌ʹ։ൃϒϥϯν ʹࡉ͔͘merge͍ͯ͘͠ઓུ ٕࣾज़ษڧձ 2017/08/03 id:shiba_yu36
࠷ۙେ͖Ίͳ৽ػೳΛ࡞Δ࣌ɺ ։ൃϒϥϯνʹࡉ͔͘merge͢ ΔઓུΛ͍ͬͯΔͷͰհ
جຊతͳઓུ • Ϣʔβʔʹ৽ػೳ͕ݟ͑ͳ͍Α͏ʹ͢ΔΛ͠ɺ ৽ػೳͷbranchͲΜͲΜmerge͍ͯ͘͠ • PRՄೳͳݶΓࡉ͔͘ • ࠷ޙʹϢʔβʔʹ৽ػೳΛݟ͑ΔΑ͏ͳϦϦʔεΛ ͢Δ
Πϝʔδ NBTUFS EFWFMPQ G SFMFBTF G G ࠷ऴSFMFBTF
͍ΖΜͳࣦഊ͔Β ͜ͷઓུʹࢸͬͨ
Α͋͘Δࣦഊύλʔϯͦͷ1 ڊେPRύλʔϯ
ڊେPRύλʔϯ • ৽ػೳͷͨΊͷίʔυΛҰͭͷPRʹ·ͱΊͯ mergeͯ͠ϦϦʔε GCJHCBOH EFWFMPQ
ࠔΔ͜ͱ • ίϯϑϦΫτ • ϨϏϡʔ͢Δ؍͕ଟ͗ͯ͢ݟམͱ͢ -> ҆ఆੑ× • ࢦఠ͕ଟ͘ͳΓ͕ͪ ->
ϨϏϡʔ͞ΕΔଆ͕ർฐ • ϨϏϡʔͷԠुͰർฐ͢Δ -> Ͳͬͪਏ͍
ײ֮తʹ500ߦ ͖͑ͯͨลΓͰਏ͍
Α͋͘Δࣦഊύλʔϯͦͷ2 ৽ػೳϦϦʔεϒϥϯνύλʔϯ
৽ػೳϦϦʔεϒϥϯν • ৽ػೳͷϦϦʔε༻ϒϥϯνΛҰͭ༻ҙͯ͠ɺͦ͜ ʹPRΛૹΔύλʔϯ • PRࡉ͔͘ϨϏϡʔ͞ΕɺϦϦʔε༻ϒϥϯν
GSFMFBTF EFWFMPQ G G
ࠔΔ͜ͱ • ίϯϑϦΫτ࠶ͼ • ࠷ޙʹϦϦʔεPRΛશνΣοΫ͠ͳ͍ͱ҆৺Ͱ ͖ͳ͍ • ଞͷػೳͰඞཁʹͳͬͨϝιουΛcherry-pick ͠·͘Δ
ࠔΔ͜ͱ • ίϯϑϦΫτ࠶ͼ • ࠷ޙʹϦϦʔεPRΛશνΣοΫ͠ͳ͍ͱ҆৺Ͱ ͖ͳ͍ • ଞͷػೳͰඞཁʹͳͬͨϝιουΛcherry-pick ͠·͘Δ ಛʹ͜Ε͕͍
• feature1Ͱfind_hoge_blogͱ͍͏ϝιουΛ࡞Δ • feature2Ͱಉ͡ϝιουΛ͏͜ͱʹͳͬͨ • find_hoge_blogΛ࡞ͬͨcommitΛcherry-pick͢ Δ? • ͔ͦ͠͠ͷcommitΛcherry-pick͢Δͱมͳίʔ υฆΕͯ͘Δ
• ίϐϖ͢Δ͔͠ͳ͍ʁʁʁ
͍͍ײ͡ʹΔํ๏͋Γ ͦ͏͚ͩͲɺͱʹ͔͘େม
͜ͷΑ͏ͳࣦഊ͔Β ࠷ॳͷઓུΛऔΔΑ͏ʹ
(࠶ܝ)جຊతͳઓུ • Ϣʔβʔʹ৽ػೳ͕ݟ͑ͳ͍Α͏ʹ͢ΔΛ͠ɺ ৽ػೳͷbranchͲΜͲΜmerge͍ͯ͘͠ • PRՄೳͳݶΓࡉ͔͘ • ࠷ޙʹϢʔβʔʹ৽ػೳΛݟ͑ΔΑ͏ͳϦϦʔεΛ ͢Δ
(࠶ܝ)جຊతͳઓུ • Ϣʔβʔʹ৽ػೳ͕ݟ͑ͳ͍Α͏ʹ͢ΔΛ͠ɺ ৽ػೳͷ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൪·ͰϢʔβʔ͔Βݟ͑ ͳ͍ͷͰɺਵ࣌ϦϦʔεՄೳ
ׂ͢Δ 1. Elasticsearchͷ։ൃڥ࡞Γ(खݩɺ։ൃڥɺຊ൪) 2. ݕࡧ͍ͨ͠σʔλͷElasticsearchͷಉظ 3. ݕࡧΫΤϦͰͷݕࡧཪଆΛMySQL͔ΒElasticsearch ʹஔ͖͑ 4. ElasticsearchΛͬͯιʔτΛ࣮
ύλʔϯ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 %] <section id="feature1"> ... </section> [%-
END %] ...
JSͱ͔ཁૉ͕͋Δ࣌ͷ Έ༗ޮʹ͢ΔͷͰରॲՄೳ
ͨ͠ΒϑϥάΛͬͨif จΛফͨ͠ΒϦϦʔεͰ͖Δ
ύλʔϯ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.html lessͱ͔JSͱ͔͍͍ײ͡ʹ
• sub feature1_renewal -> sub feature1 • feature1_renewal.html -> feature1.html
• lessͱ͔ҰؾʹҠಈ • ࠷ޙ͚ͩͪΐͬͱେมͰ͋Δ
·ͱΊ • େ͖Ίͳ৽ػೳ࡞Γͷ࣌ͷmergeઓུʹͭ ͍ͯͷ • ࣦഊܦݧ͔ΒϢʔβʔʹݟ͑ͳ͍Α͏ʹͲ ΜͲΜ։ൃϒϥϯνʹmerge͢ΔΑ͏ʹ ͳͬͨ • ݟ͑ͳ͍Α͏ʹ͢Δύλʔϯ͍Ζ͍Ζ