Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
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
17k
新機能作成時に開発ブランチに細かくmergeしていく戦略/merge-strategy-for-new-feature
shibayu36
August 07, 2017
Tweet
Share
More Decks by shibayu36
See All by shibayu36
今の生産性改善活動で大切にしている考え方
shibayu36
8
8.4k
エンジニアメンター制度の効果的な運用を目指して/improve-mentor-system
shibayu36
27
10k
グレードイメージ具体化のため昇格理由を公開する
shibayu36
8
5.8k
一から始めるJavaScriptユニットテスト/js-unit-test-from-scratch
shibayu36
8
33k
技術ブログを書くことについて/writing-tech-blog
shibayu36
17
26k
はてなと技術研修
shibayu36
1
6.3k
はてなブログチームの開発フローとGitHub
shibayu36
145
76k
課題をテストで解決する
shibayu36
2
2.3k
Fluentd, mongoDB, Kibanaを利用したはてなブログABテストの事例
shibayu36
30
12k
Other Decks in Programming
See All in Programming
Go の GC の不得意な部分を克服したい
taiyow
2
760
nekko cloudにおけるProxmox VE利用事例
irumaru
3
420
ソフトウェアの振る舞いに着目し 複雑な要件の開発に立ち向かう
rickyban
0
890
HTTP compression in PHP and Symfony apps
dunglas
2
1.7k
MCP with Cloudflare Workers
yusukebe
2
220
事業成長を爆速で進めてきたプロダクトエンジニアたちの成功談・失敗談
nealle
3
1.4k
Semantic Kernelのネイティブプラグインで知識拡張をしてみる
tomokusaba
0
180
The Efficiency Paradox and How to Save Yourself and the World
hollycummins
1
440
テスト自動化失敗から再挑戦しチームにオーナーシップを委譲した話/STAC2024 macho
ma_cho29
1
1.3k
創造的活動から切り拓く新たなキャリア 好きから始めてみる夜勤オペレーターからSREへの転身
yjszk
1
130
Discord Bot with AI -for English learners-
xin9le
1
120
Итераторы в Go 1.23: зачем они нужны, как использовать, и насколько они быстрые?
lamodatech
0
620
Featured
See All Featured
The Art of Programming - Codeland 2020
erikaheidi
53
13k
No one is an island. Learnings from fostering a developers community.
thoeni
19
3k
Statistics for Hackers
jakevdp
796
220k
Navigating Team Friction
lara
183
15k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
111
49k
Imperfection Machines: The Place of Print at Facebook
scottboms
266
13k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.1k
Building Your Own Lightsaber
phodgson
103
6.1k
The World Runs on Bad Software
bkeepers
PRO
65
11k
[RailsConf 2023] Rails as a piece of cake
palkan
53
5k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
29
2k
Why Our Code Smells
bkeepers
PRO
335
57k
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͢ΔΑ͏ʹ ͳͬͨ • ݟ͑ͳ͍Α͏ʹ͢Δύλʔϯ͍Ζ͍Ζ