Slide 1

Slide 1 text

辘हݒᰁ
 ԅ֜胼ᦏ Ruby 盠܈狝 笳碭ቡ

Slide 2

Slide 2 text

य़疑অ, ౯ݞ笳碭ቡ github.com/pmq20 twitter @psvr

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

GitLab 耬ᵅ #15452 “On average it seems to take around 13 seconds to cherry-pick commits for GitLab CE. Most of the time appears to be spent in GitHooksService#execute (around 10 seconds on average).” – Yorick Peterse

Slide 7

Slide 7 text

GitLab 耬ᵅ #15452 https://gitlab.com/gitlab-org/gitlab-ce/issues/15452

Slide 8

Slide 8 text

GitLab 耬ᵅ #15452 https://gitlab.com/gitlab-org/gitlab-ce/issues/15452 system(…pre-receive…) 
 system(…update…) system(…post-receive…)

Slide 9

Slide 9 text

Kernel#system

Slide 10

Slide 10 text

ಗᤈ෸ᳵᕅ 60ms ጱ Ruby 郥๜

Slide 11

Slide 11 text

አ system ݄᧣疰ݒ౮ԧ 600ms

Slide 12

Slide 12 text

簁ᘒ unsetenv_others ݢ盵瓰蝧ଶ

Slide 13

Slide 13 text

ٌਙᥡ疗ᕮຎ • “./update” ஠ᶳԅ Ruby 纷ଧ牧覍 Ruby 犋瓰ሿ • “./update” ݢ覍ଉᓌܔ牧 Hello World ܨݢ瓰ሿ

Slide 14

Slide 14 text

[demo]

Slide 15

Slide 15 text

unsetenv_others ฎՋԍ牫 • 蟴ᗝฎ玽竃ቘ辘हݒᰁ • ୮ unsetenv_others: true ෸牧霙ᤈक़蟂纷ଧ獮竃ቘ ಅ磪辘हݒᰁ牧ᴻ覍ฎก繊瞲ਧጱݒᰁ • ୮ unsetenv_others: false ෸牧犋竃ቘҁ认ᦊᤈԅ҂

Slide 16

Slide 16 text

gitlab-ce: MR-3939 https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/3939

Slide 17

Slide 17 text

– Yorick Peterse “I'm a bit confused, how does unsetting environment variables make things run faster?”

Slide 18

Slide 18 text

– Douwe Maan “The measurements don't lie, but I'm not quite sure why this works either. Can you elaborate?”

Slide 19

Slide 19 text

चᏐᎣᦩ

Slide 20

Slide 20 text

ྯӻᬰ纷᮷磪ᛔ૩ጱᆿᬰ纷 ྯӻᬰ纷᮷ฎݚӞӻᬰ纷貉ۖጱ

Slide 21

Slide 21 text

ྯӻᬰ纷᮷磪ᛔ૩ᇿ缏ጱ辘हݒᰁ

Slide 22

Slide 22 text

ྯӻᬰ纷᮷磪ᛔ૩ᇿ缏ጱ辘हݒᰁ

Slide 23

Slide 23 text

ৼᬰ纷՗ᆿᬰ纷Ӿᖀ瞚辘हݒᰁ

Slide 24

Slide 24 text

֕ৼᬰ纷犋胼狕硬ᆿᬰ纷ጱ辘हݒᰁ

Slide 25

Slide 25 text

വᦞ1 辘हݒᰁ鋓ᬰ纷ᕮ๳ᘒ窞犜 ҁshell ฎ IRB ጱᆿᬰ纷҂

Slide 26

Slide 26 text

വᦞ2 窔ኞৼᬰ纷ݢ皤ᖅᆿᬰ纷辘हݒᰁጱኞ޸珏๗ ҁIRB ฎ shell ጱᆿᬰ纷҂

Slide 27

Slide 27 text

ᆿᬰ纷磪ߺ犚ݢ綡ጱ辘 हݒᰁ᭳փᕳԧৼᬰ纷牫

Slide 28

Slide 28 text

BUNDLE_BIN_PATH /Users/pmq20/.rvm/gems/ruby-2.1.8/ gems/bundler-1.12.4/exe/bundle BUNDLE_GEMFILE /Users/pmq20/gitlab-development- kit/gitlab/Gemfile BUNDLE_ORIG_GEM_PATH /Users/pmq20/.rvm/gems/ ruby-2.1.8:/Users/pmq20/.rvm/gems/ ruby-2.1.8@global BUNDLE_ORIG_MANPATH /usr/local/man:

Slide 29

Slide 29 text

GEM_HOME /Users/pmq20/.rvm/gems/ruby-2.1.8 GEM_PATH /Users/pmq20/.rvm/gems/ ruby-2.1.8:/Users/pmq20/.rvm/gems/ ruby-2.1.8@global RUBYLIB /Users/pmq20/.rvm/gems/ruby-2.1.8/ gems/bundler-1.12.4/lib RUBYOPT -rbundler/setup

Slide 30

Slide 30 text

RUBY_VERSION ruby-2.1.8 rvm_bin_path /Users/pmq20/.rvm/bin rvm_path /Users/pmq20/.rvm rvm_prefix /Users/pmq20

Slide 31

Slide 31 text

ᇨՈ΅͠獮Ͷ牦

Slide 32

Slide 32 text

GEM_HOME /Users/pmq20/.rvm/gems/ruby-2.1.8 GEM_PATH /Users/pmq20/.rvm/gems/ ruby-2.1.8:/Users/pmq20/.rvm/gems/ ruby-2.1.8@global RUBYLIB /Users/pmq20/.rvm/gems/ruby-2.1.8/ gems/bundler-1.12.4/lib RUBYOPT -rbundler/setup

Slide 33

Slide 33 text

RUBYOPT man ruby

Slide 34

Slide 34 text

e.g.

Slide 35

Slide 35 text

ৼᬰ纷ᖀ瞚ԧᆿᬰ纷ጱ RUBYOPT=-rbundler/setup

Slide 36

Slide 36 text

ᘒ bundler/setup ಗᤈ盄眸 ࢩ種ৼᬰ纷ಗᤈ盄眸

Slide 37

Slide 37 text

簁ᘒक़蟂 shell ๚ਧԎᧆݒᰁ

Slide 38

Slide 38 text

貉ۖ Rails ݸ಍磪ԧᧆݒᰁ

Slide 39

Slide 39 text

RUBYOPT=-rbundler/setup ՗֜ᘒ๶牫

Slide 40

Slide 40 text

ᆿᬰ纷ฎአ bin/rails 貉ۖጱ

Slide 41

Slide 41 text

bin/rails ᧣አԧ config/boot

Slide 42

Slide 42 text

config/boot ᧣አԧ bundler/setup

Slide 43

Slide 43 text

bundler/setup ᦡਧԧ RUBYOPT=-rbundler/setup ࢩ種 bundler/setup ฎٍ磪փ礕௔ጱ bundler ᦏಅ磪 bundler ᓕቘጱᬰ纷ጱৼᬰ纷᮷ᤩ bundler ᓕቘ

Slide 44

Slide 44 text

bundler/setup
 ฎՋԍ牫

Slide 45

Slide 45 text

bundler/setup ฎӞӻ෈կ

Slide 46

Slide 46 text

bundler/setup ጱֵአ࣋ว • bin/rails ᧣አԧ bundler/setup • bundle exec * ᧣አԧ bundler/setup • bundle show * ᧣አԧ bundler/setup • bundle bin-stubs ጱኞ౮ᇔ᮷᧣አԧ bundler/setup • ࢩ種 bundler/setup پԒฎ Ruby 貉ۖ鉑纷ጱຽ蟴

Slide 47

Slide 47 text

bundler/setup ጱᦡᦇፓຽ • “make your code see just the dependencies that it should see and nothing else” • 矒ګঅ gem ପጱے᫹᪠趥矾ᔱᶲଧ • ᦏ纷ଧ௴অ胼୚አک Gemfile Ӿ瞲ਧጱ粚๜ጱପ • ᘒӬ獡ฎ Gemfile Ӿ๚瞲ਧጱ gem ᮷犋ݢᥠ

Slide 48

Slide 48 text

Kernel#require • require ‘thing’ • ইຎ ‘thing’ ૪ᕪے᫹鉑牧ಗᤈᕮ๳ • 玽ڞ螁ܲ $LOAD_PATH ($:) ತک ‘thing’ ଚے᫹ԏ • 舙ತ犋کڞಲڊ LoadError

Slide 49

Slide 49 text

rubygems/core_ext/ kernel_require.rb • ᯿碝಑୏ Kernel ଚ remove_method ധԧ :require • ᯿碝ਧԎԧ Kernel#require • ᛔ Ruby 1.9 犥๶ RubyGems ฎٖᗝጱଚᛔۖ貉አ • ᛔ Ruby 1.9 犥๶鉖಍ฎ Kernel#require ጱ፥ྋᶎፓ

Slide 50

Slide 50 text

rubygems/core_ext/ kernel_require.rb • require ‘thing’ • ইຎ ‘thing’ ૪ᕪے᫹鉑牧ಗᤈᕮ๳ • 玽ڞ螁ܲ $LOAD_PATH ($:) ತک ‘thing’ ଚے᫹ԏ • 玽ڞ՗૪ਞᤰጱ gem Ӿ੔ತ ‘thing’ ଚ಩ᧆ gem ጱ ᪠趥ے獈 $LOAD_PATH ($:) • 舙ತ犋کڞಲڊ LoadError

Slide 51

Slide 51 text

牬demo] require pry, edit require

Slide 52

Slide 52 text

bundler/setup ࣁ狶Ջԍ • ತکӞᕟ粬ਧ粚๜ጱ gem牧玲ڊ犢ժጱ gemspec • ಩ਙժጱ lib/ ፓ趟ጱᕷ੒᪠趥ے獈 $LOAD_PATH牧 犥׎ Ruby ݢ犥 require ک粬ਧ粚๜ጱ gem • “unpatch”物݄ധ rubygems/core_ext/ kernel_require.rb ጱ鉪ᬋ牧犥׎贶ሿ“獡ฎ Gemfile Ӿ๚瞲ਧጱ gem ᮷犋ݢᥠ”

Slide 53

Slide 53 text

牬demo] reverse_rubygems_kernel_mixin

Slide 54

Slide 54 text

– hooopo “ഝ᧔牧Bundler ޾ Rubygems ᥝݳଚԧ”

Slide 55

Slide 55 text

– huacnlee “疰ᧆݳଚ牧ݶ遞ጱӳᥜ”

Slide 56

Slide 56 text

෸ᳵ᮷݄ߺدԧ牫

Slide 57

Slide 57 text

Bundler::Resolver.resolve • 臺ᩇԧ踞ጯྺᑁጱಗᤈ෸ᳵ • ತک磧犭ጱ gem ᕟݳ牧ֵ஑犢ժݢჿ᪃粬ਧጱ狅ᩢ ޾ৼ狅ᩢ蹇կҁܨ Gemfile + Gemfile.lock҂ • ᬌ獈物Ӟᕟ狅ᩢ蹇կҁܨ Gemfile + Gemfile.lock҂ • ᬌڊ物Ӟᕟ gemspec

Slide 58

Slide 58 text

Gemfile.lock ጱᦡᦇ௏మ • 薹ຉਠ Gemfile ݸ಩ᕮຎᖨਂӥ๶ጱӞӻ๢ګ • ۱珀 “exact versions of all of the gems that you used the last time you know for sure that the application worked” • 犌 npm 2 / npm 3 ᦡᦇ௏మጱ੒穉

Slide 59

Slide 59 text

Gemfile 犌 Gemfile.lock 
 ݢ胼ڊሿ犋ݶྍ • ࣁ૪磪 Gemfile.lock ጱ眐٭ӥ牧አಁๅ碝ԧ Gemfile ᘒဌ磪᯿碝 bundle牧ڞ Gemfile.lock 鉑๗ • 舙羬ᕹ૪磪胼ჿ᪃ Gemfile 碝襑穩ጱ gem牧ڞ貉ۖ ଫአ෸ᛔۖๅ碝 Gemfile.lock • 舙羬ᕹჿ᪃犋ԧ Gemfile ጱ碝襑穩牧ڞಸᲙ • ࢩ種ྯ稞貉ۖ᮷ᥝ᯿碝薹 Gemfile + Gemfile.lock

Slide 60

Slide 60 text

Molinillo ᓒဩ • Ӟӻ蝢አጱ狅ᩢ穩薹ᓒဩ • 玲ᛔ CocoaPods • ᬌ獈物狅ᩢ蹇կ҄狅ᩢᲁਧࢶ • ᬌڊ物狅ᩢ薹ࢶ

Slide 61

Slide 61 text

禊盢ು虡 • search_for(dependency) አ๶矾ᔱჿ᪃ᕳਧ狅ᩢጱ狅ᩢᥢ໒ • dependencies_for(specification) አ๶蜴ࢧᕳਧᥢ໒ጱ狅ᩢ • requirement_satisfied_by?(requirement, activated, spec) ࣁ୮ 獮ጱ狅ᩢࢶ activated Ӿᦇᓒ requirement ฎ玽胼ᤩ spec ჿ᪃ • sort_dependencies(dependencies, activated, conflicts) ԅ൉ ṛ௔胼牧ೲ“਻ฃ薹”ጱᶲଧ矎ଧ dependencies ؃ᦡਂࣁӞӻ“狅ᩢᥢ໒൉׀ᘏ”牧ਙ贶ሿইӥොဩ

Slide 62

Slide 62 text

Molinillo ᓒဩጱ௏᪠ च๜௏మ——ࢧშဩ

Slide 63

Slide 63 text

຾ ᇫாᦡᦇ - ୮獮ጱ襑穩ጱݷਁ - ୮獮੢๚ჿ᪃ጱ襑穩褸ݳ - ୮獮蟂獤薹牧ܨ૪筕ၚጱ狅ᩢࢶ - ୮獮ጱ襑穩 - ୮獮ጱ襑穩ጱݢᤈ薹褸 - 鉟趞窼ଶ - ٫统褸

Slide 64

Slide 64 text

狅ᩢா ܨӞञ襑穩޾Ӟञݢᤈ薹 ݢᤈ薹ா ܨӞञ襑穩޾Ӟӻݢᤈ薹 ຾

Slide 65

Slide 65 text

Ԇ盌辘 ݝᥝ୮獮ᇫா鉕磪୮獮੢๚ჿ ᪃ጱ襑穩疰ᖀᖅ盌辘 ڡত狅ᩢா

Slide 66

Slide 66 text

੤ᦶ碝ጱݢᤈ薹 ڡত狅ᩢா ݢᤈ薹ா … 狅ᩢா ڡত狅ᩢா … 狅ᩢா 蟂獤薹ࢶӾฎ玽૪珀ᧆ薹牫ฎ玽ჿ᪃粚๜ᥝ穩牫
 ฎ玽ჿ᪃ Gemfile.lock牫 ੤ᦶ筕ၚᧆݢᤈ薹

Slide 67

Slide 67 text

੤ᦶ碝ጱݢᤈ薹 ڡত狅ᩢா ݢᤈ薹ா … 狅ᩢா ڡত狅ᩢா … 狅ᩢா 舙०ᨳ牧ᦕ趟٫统牧ࢧშ

Slide 68

Slide 68 text

຾绚෫薹 ݱᐿࢧშ ڡত狅ᩢா … ୮獮ᇫா

Slide 69

Slide 69 text

Ԇ盌辘 ڡত狅ᩢா … ୮獮ᇫா ڡত狅ᩢா … 薹ா
 ෫ๅग़襑穩 ୮獮蟂獤薹ܨ磧ᕣ薹 玲૪筕ၚጱ狅ᩢࢶ蜴ࢧ

Slide 70

Slide 70 text

Molinillo ᓒဩጱ෸ᳵ瓰ᄖଶ • ᇫா绚ᳵጱय़ੜ 犔犥 ᇫா᫨ᑏጱᩇአ • ᇫா绚ᳵጱय़ੜ玲豙ԭ物狅ᩢ޾ৼ狅ᩢጱ踞ᰁ(m)牧 ݢ鉝ጱ粚๜ጱ磧य़踞ᰁ(n)牧n^m • O(n^m) • 贶ᴬኼ犭牧ଃ磪獮ᗝᶼၥ獶ຏ

Slide 71

Slide 71 text

盥綡 • ྯ稞貉ۖጱ෸狡ಗᤈ Molinillo ᓒဩ፥ጱ஠ᥝހ牫 • Gemfile + Gemfile.lock ጱݶྍ௔፥ጱ盄᯿ᥝހ牫 • ᇚᇗྯ稞貉ۖ Ruby 纷ଧጱ硳ሲ牧绗ᒌഘ๶ԧՋԍ牫 • Gemfile.lock ጱᦡᦇฎ஠ᶳጱހ牫

Slide 72

Slide 72 text

ᥝ犋൉ӻ Issue / PR牫

Slide 73

Slide 73 text

犡ଙ 5์26෭
 磪Ո൉鉑ԧ https://github.com/bundler/bundler/pull/4618

Slide 74

Slide 74 text

No content

Slide 75

Slide 75 text

– Jason Frey “You know, you really shouldn't be resolving if you have a lockfile...”

Slide 76

Slide 76 text

– Joe Rafaniello “Properly detect path spec changes to avoid needless re-resolve”

Slide 77

Slide 77 text

If there were no changes, just use the resolution from Gemfile.lock.

Slide 78

Slide 78 text

No content

Slide 79

Slide 79 text

No content

Slide 80

Slide 80 text

੒穉 Rails ٖ蟂᧣አ 犌 ፗ矑᧣አ
 ௔胼ഖ聻磪ಅ犋ݶ

Slide 81

Slide 81 text

No content

Slide 82

Slide 82 text

No content

Slide 83

Slide 83 text

ܻࢩ • bundler/setup ԏݸ牧य़ᰁጱ辘हݒᰁᤩ狕硬ҁই BUNDLE_GEMFILE牏RUBYLIB牏RUBYOPT牏 BUNDLE_BIN_PATH 缛҂ • ৼᬰ纷ᤩ貉ۖ෸ᖀ瞚ԧᆿᬰ纷ጱ辘हݒᰁҁই BUNDLE_GEMFILE牧ܨ Gemfile ጱ֖ᗝ҂ • ࢩ種୮ৼᬰ纷ᤩ貉ۖ෸牧ᆿᬰ纷ጱ Gemfile 蚏֢አ牧 ৼᬰ纷ጱ Gemfile ᤩ஺ኼ

Slide 84

Slide 84 text

薹豙ො礯物 Bundler.with_clean_env

Slide 85

Slide 85 text

No content

Slide 86

Slide 86 text

Clean environment variables when running git hooks https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/ 6344

Slide 87

Slide 87 text

No content

Slide 88

Slide 88 text

No content

Slide 89

Slide 89 text

玱௏ • ஠ᶳ RUBYOPT=-rbundler/setup ހ牫 • bundler/setup ፥ጱ磪஠ᥝฎփ礕௔ጱހ牫

Slide 90

Slide 90 text

硽ᦒ • 犋ᥝ蝈מ๦শ牧ྯ稞᯿碝 resolve ଚ犋ฎกฬጱᦡᦇ • 犋੒ጱ瑿ො疰ᥝ玄碁᧔ڊ๶牧疰猟 Jason Frey ᮎ໏ • ྯӻՈ᮷磪ݢ胼ݎሿଚ狕瓰 bug牧鉖ฎ୏რጱঅ賳

Slide 91

Slide 91 text

硽ᦒ • ൉Իᤑӟԏ獮ض፡Ӟӥฎ玽磪Ո൉Ի鉑牧౲ҁๅٍݢ 砺֢瑿҂ض礚፡磧碝୏ݎ獤ඪฎ玽Ֆ磪ᳯ᷌ • ࣙ瞱܋ᕆ gem ک磧碝粚๜ҁ bundler 1.13 vs 1.12҂ • 犭玕অ Bundler牧Ruby ጱ貉ۖ෸ᳵݢ犥盠܈狝牦

Slide 92

Slide 92 text

ᨀᨀ

Slide 93

Slide 93 text

https://github.com/pmq20