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.6k
エンジニアメンター制度の効果的な運用を目指して/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.4k
Fluentd, mongoDB, Kibanaを利用したはてなブログABテストの事例
shibayu36
30
12k
Other Decks in Programming
See All in Programming
すべてのコンテキストを、 ユーザー価値に変える
applism118
3
1.3k
AIともっと楽するE2Eテスト
myohei
6
2.6k
なぜ適用するか、移行して理解するClean Architecture 〜構造を超えて設計を継承する〜 / Why Apply, Migrate and Understand Clean Architecture - Inherit Design Beyond Structure
seike460
PRO
3
770
10 Costly Database Performance Mistakes (And How To Fix Them)
andyatkinson
0
340
ペアプロ × 生成AI 現場での実践と課題について / generative-ai-in-pair-programming
codmoninc
2
18k
スタートアップの急成長を支えるプラットフォームエンジニアリングと組織戦略
sutochin26
1
5.8k
Webの外へ飛び出せ NativePHPが切り拓くPHPの未来
takuyakatsusa
2
560
A full stack side project webapp all in Kotlin (KotlinConf 2025)
dankim
0
120
イベントストーミング図からコードへの変換手順 / Procedure for Converting Event Storming Diagrams to Code
nrslib
2
830
RailsGirls IZUMO スポンサーLT
16bitidol
0
190
Deep Dive into ~/.claude/projects
hiragram
14
2.6k
Python型ヒント完全ガイド 初心者でも分かる、現代的で実践的な使い方
mickey_kubo
1
120
Featured
See All Featured
Designing for Performance
lara
610
69k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
233
17k
Reflections from 52 weeks, 52 projects
jeffersonlam
351
20k
The Art of Programming - Codeland 2020
erikaheidi
54
13k
Code Review Best Practice
trishagee
69
18k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
50
5.5k
Raft: Consensus for Rubyists
vanstee
140
7k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
The Straight Up "How To Draw Better" Workshop
denniskardys
234
140k
jQuery: Nuts, Bolts and Bling
dougneiner
63
7.8k
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
Git: the NoSQL Database
bkeepers
PRO
430
65k
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͢ΔΑ͏ʹ ͳͬͨ • ݟ͑ͳ͍Α͏ʹ͢Δύλʔϯ͍Ζ͍Ζ