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.5k
エンジニアメンター制度の効果的な運用を目指して/improve-mentor-system
shibayu36
27
10k
グレードイメージ具体化のため昇格理由を公開する
shibayu36
8
5.9k
一から始めるJavaScriptユニットテスト/js-unit-test-from-scratch
shibayu36
8
33k
技術ブログを書くことについて/writing-tech-blog
shibayu36
17
26k
はてなと技術研修
shibayu36
1
6.4k
はてなブログチームの開発フローとGitHub
shibayu36
145
76k
課題をテストで解決する
shibayu36
2
2.3k
Fluentd, mongoDB, Kibanaを利用したはてなブログABテストの事例
shibayu36
30
12k
Other Decks in Programming
See All in Programming
エンジニア向けCursor勉強会 @ SmartHR
yukisnow1823
3
13k
プロダクトエンジニアのしごと 〜 受託 × 高難度を乗り越えるOptium開発 〜
algoartis
0
230
The New Developer Workflow: How AI Transforms Ideas into Code
danielsogl
0
140
eBPF超入門「o11yに使える」とは (20250424_eBPF_o11y)
thousanda
1
120
事業KPIを基に価値の解像度を上げる
nealle
0
130
REALITY コマンド作成チュートリアル
nishiuriraku
0
120
“技術カンファレンスで何か変わる?” ──RubyKaigi後の自分とチームを振り返る
ssagara00
0
120
設計の本質:コード、システム、そして組織へ / The Essence of Design: To Code, Systems, and Organizations
nrslib
10
3.8k
ドメイン駆動設計とXPで支える子どもの未来 / Domain-Driven Design and XP Supporting Children's Future
nrslib
0
310
iOSアプリで測る!名古屋駅までの 方向と距離
ryunakayama
0
160
一緒に働きたくなるプログラマの思想 #QiitaConference
mu_zaru
82
21k
データと事例で振り返るDevin導入の"リアル" / The Realities of Devin Reflected in Data and Case Studies
rkaga
3
2.3k
Featured
See All Featured
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
47
2.7k
Practical Orchestrator
shlominoach
187
11k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
A better future with KSS
kneath
239
17k
The Pragmatic Product Professional
lauravandoore
33
6.6k
RailsConf 2023
tenderlove
30
1.1k
VelocityConf: Rendering Performance Case Studies
addyosmani
329
24k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
Documentation Writing (for coders)
carmenintech
71
4.8k
Designing for humans not robots
tammielis
253
25k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
5
610
Intergalactic Javascript Robots from Outer Space
tanoku
271
27k
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͢ΔΑ͏ʹ ͳͬͨ • ݟ͑ͳ͍Α͏ʹ͢Δύλʔϯ͍Ζ͍Ζ