pkgr 1.2.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. data/README.md +16 -2
  2. data/data/build_dependencies/centos.yml +13 -0
  3. data/{lib/pkgr/data/distributions/debian/build_dependencies.yml → data/build_dependencies/debian.yml} +2 -2
  4. data/data/build_dependencies/ubuntu.yml +15 -0
  5. data/data/buildpacks/centos-6 +2 -0
  6. data/data/buildpacks/debian-6 +2 -0
  7. data/{lib/pkgr/data/distributions/debian/buildpacks/debian_wheezy → data/buildpacks/debian-7} +1 -1
  8. data/data/buildpacks/ubuntu-10.04 +2 -0
  9. data/{lib/pkgr/data/distributions/debian/buildpacks/ubuntu_precise → data/buildpacks/ubuntu-12.04} +1 -1
  10. data/{lib/pkgr/data/distributions/debian/runner.erb → data/cli/cli.sh.erb} +105 -57
  11. data/data/dependencies/centos.yml +9 -0
  12. data/{lib/pkgr/data/distributions/debian/dependencies.yml → data/dependencies/debian.yml} +2 -2
  13. data/data/dependencies/ubuntu.yml +21 -0
  14. data/data/environment/default.erb +9 -0
  15. data/{lib/pkgr/data/distributions/debian → data}/hooks/postinstall.sh +7 -4
  16. data/data/hooks/preinstall.sh +13 -0
  17. data/{lib/pkgr/data/distributions/debian/sysv → data/init/sysv/lsb-3.1}/master.erb +0 -0
  18. data/{lib/pkgr/data/distributions/debian/sysv → data/init/sysv/lsb-3.1}/process.erb +84 -11
  19. data/{lib/pkgr/data/distributions/debian/sysv → data/init/sysv/lsb-3.1}/process_master.erb +0 -0
  20. data/{lib/pkgr/data/distributions/debian/upstart → data/init/upstart/1.5}/init.d.sh.erb +0 -0
  21. data/{lib/pkgr/data/distributions/debian/upstart → data/init/upstart/1.5}/master.conf.erb +0 -0
  22. data/{lib/pkgr/data/distributions/debian/upstart → data/init/upstart/1.5}/process.conf.erb +0 -0
  23. data/{lib/pkgr/data/distributions/debian/upstart → data/init/upstart/1.5}/process_master.conf.erb +0 -0
  24. data/{lib/pkgr/data/distributions/debian → data/logrotate}/logrotate.erb +0 -0
  25. data/lib/pkgr.rb +1 -1
  26. data/lib/pkgr/builder.rb +8 -2
  27. data/lib/pkgr/buildpack.rb +1 -0
  28. data/lib/pkgr/cli.rb +12 -6
  29. data/lib/pkgr/config.rb +20 -2
  30. data/lib/pkgr/distributions.rb +9 -7
  31. data/lib/pkgr/distributions/base.rb +159 -0
  32. data/lib/pkgr/distributions/centos.rb +12 -0
  33. data/lib/pkgr/distributions/debian.rb +39 -163
  34. data/lib/pkgr/distributions/redhat.rb +51 -0
  35. data/lib/pkgr/distributions/runner.rb +39 -0
  36. data/lib/pkgr/distributions/ubuntu.rb +17 -0
  37. data/lib/pkgr/version.rb +1 -1
  38. metadata +30 -29
  39. data/lib/pkgr/app.rb +0 -279
  40. data/lib/pkgr/data/bin/executable +0 -36
  41. data/lib/pkgr/data/config/pre_boot.rb +0 -15
  42. data/lib/pkgr/data/distributions/debian/buildpacks/debian_squeeze +0 -2
  43. data/lib/pkgr/data/distributions/debian/buildpacks/ubuntu_lucid +0 -2
  44. data/lib/pkgr/data/distributions/debian/cron.d +0 -4
  45. data/lib/pkgr/data/distributions/debian/default.erb +0 -12
  46. data/lib/pkgr/data/distributions/debian/hooks/preinstall.sh +0 -9
  47. data/lib/pkgr/data/pkgr.yml +0 -32
  48. data/lib/pkgr/distributions/debian_squeeze.rb +0 -11
  49. data/lib/pkgr/distributions/debian_wheezy.rb +0 -11
  50. data/lib/pkgr/distributions/ubuntu_lucid.rb +0 -15
  51. data/lib/pkgr/distributions/ubuntu_precise.rb +0 -15
@@ -0,0 +1,12 @@
1
+ require "pkgr/distributions/redhat"
2
+
3
+ module Pkgr
4
+ module Distributions
5
+ # Contains the various components required to make a packaged app integrate well with a CentOS system.
6
+ class Centos < Redhat
7
+ def runner
8
+ @runner ||= Runner.new("upstart", "1.5")
9
+ end
10
+ end
11
+ end
12
+ end
@@ -1,182 +1,58 @@
1
1
  require 'pkgr/buildpack'
2
2
  require 'pkgr/process'
3
- require 'yaml'
4
- require 'erb'
3
+ require 'pkgr/distributions/base'
5
4
 
6
5
  module Pkgr
7
6
  module Distributions
8
- class Debian
9
-
10
- # Must be subclassed.
11
- def codename
12
- raise NotImplementedError, "codename must be set"
7
+ # Contains the various components required to make a packaged app integrate well with a Debian system.
8
+ class Debian < Base
9
+ # Only keep major digits
10
+ def release
11
+ @release[/^[0-9]+/]
13
12
  end
14
13
 
15
- def osfamily
16
- "debian"
14
+ def runner
15
+ @runner ||= Runner.new("sysv", "lsb-3.1")
17
16
  end
18
17
 
19
- def slug
20
- [osfamily, codename].join("-")
18
+ def package_test_command(package)
19
+ "dpkg -s '#{package}' > /dev/null 2>&1"
21
20
  end
22
21
 
23
- def templates(app_name)
24
- list = []
25
-
26
- # directories
27
- [
28
- "usr/local/bin",
29
- "opt/#{app_name}",
30
- "etc/#{app_name}/conf.d",
31
- "etc/default",
32
- "etc/init",
33
- "var/log/#{app_name}"
34
- ].each{|dir| list.push Templates::DirTemplate.new(dir) }
35
-
36
- # default
37
- list.push Templates::FileTemplate.new("etc/default/#{app_name}", File.new(File.join(data_dir, "default.erb")))
38
- # executable
39
- list.push Templates::FileTemplate.new("usr/local/bin/#{app_name}", File.new(File.join(data_dir, "runner.erb")), mode: 0755)
40
- # logrotate
41
- list.push Templates::FileTemplate.new("etc/logrotate.d/#{app_name}", File.new(File.join(data_dir, "logrotate.erb")))
42
-
43
- # NOTE: conf.d files are no longer installed here, since we don't want to overwrite any pre-existing config.
44
- # They're now installed in the postinstall script.
45
-
46
- list
47
- end
48
-
49
- def initializers_for(app_name, procfile_entries)
50
- list = []
51
- procfile_entries.select(&:daemon?).each do |process|
52
- Pkgr.debug "Adding #{process.inspect} to initialization scripts"
53
- # sysvinit
54
- list.push [process, Templates::FileTemplate.new("sysv/#{app_name}", data_file("sysv/master.erb"))]
55
- list.push [process, Templates::FileTemplate.new("sysv/#{app_name}-#{process.name}", data_file("sysv/process_master.erb"))]
56
- list.push [process, Templates::FileTemplate.new("sysv/#{app_name}-#{process.name}-PROCESS_NUM", data_file("sysv/process.erb"))]
57
- # upstart
58
- list.push [process, Templates::FileTemplate.new("upstart/#{app_name}", data_file("upstart/init.d.sh.erb"))]
59
- list.push [process, Templates::FileTemplate.new("upstart/#{app_name}.conf", data_file("upstart/master.conf.erb"))]
60
- list.push [process, Templates::FileTemplate.new("upstart/#{app_name}-#{process.name}.conf", data_file("upstart/process_master.conf.erb"))]
61
- list.push [process, Templates::FileTemplate.new("upstart/#{app_name}-#{process.name}-PROCESS_NUM.conf", data_file("upstart/process.conf.erb"))]
62
- end
63
- list
64
- end
65
-
66
- def check(config)
67
- missing_packages = (build_dependencies(config.build_dependencies) || []).select do |package|
68
- test_command = "dpkg -s '#{package}' > /dev/null 2>&1"
69
- Pkgr.debug "sh(#{test_command})"
70
- ! system(test_command)
71
- end
72
-
73
- unless missing_packages.empty?
74
- package_install_command = "sudo apt-get update && sudo apt-get install --force-yes -y #{missing_packages.map{|package| "\"#{package}\""}.join(" ")}"
75
- if config.auto
76
- package_install = Mixlib::ShellOut.new(package_install_command)
77
- package_install.logger = Pkgr.logger
78
- package_install.run_command
79
- package_install.error!
80
- else
81
- Pkgr.warn("Missing build dependencies detected. Run the following to fix: #{package_install_command}")
82
- end
83
- end
22
+ def package_install_command(packages)
23
+ "sudo apt-get update && sudo apt-get install --force-yes -y #{packages.map{|package| "\"#{package}\""}.join(" ")}"
84
24
  end
85
25
 
86
26
  def fpm_command(build_dir, config)
87
- %{
88
- fpm -t deb -s dir --verbose --force \
89
- -C "#{build_dir}" \
90
- -n "#{config.name}" \
91
- --version "#{config.version}" \
92
- --iteration "#{config.iteration}" \
93
- --url "#{config.homepage}" \
94
- --provides "#{config.name}" \
95
- --deb-user "root" \
96
- --deb-group "root" \
97
- -a "#{config.architecture}" \
98
- --description "#{config.description}" \
99
- --maintainer "#{config.maintainer}" \
100
- --template-scripts \
101
- --before-install #{preinstall_file(config)} \
102
- --after-install #{postinstall_file(config)} \
103
- #{dependencies(config.dependencies).map{|d| "-d '#{d}'"}.join(" ")} \
104
- .
105
- }
106
- end
107
-
108
- def buildpacks(config)
109
- custom_buildpack_uri = config.buildpack
110
- if custom_buildpack_uri
111
- uuid = Digest::SHA1.hexdigest(custom_buildpack_uri)
112
- [Buildpack.new(custom_buildpack_uri, :custom, config.env)]
113
- else
114
- load_buildpack_list(config)
115
- end
116
- end
117
-
118
- def default_buildpack_list
119
- data_file(File.join("buildpacks", "#{osfamily}_#{codename}"))
120
- end
121
-
122
- def preinstall_file(config)
123
- @preinstall_file ||= begin
124
- source = File.join(data_dir, "hooks", "preinstall.sh")
125
- file = Tempfile.new("preinstall")
126
- file.write ERB.new(File.read(source)).result(config.sesame)
127
- file.rewind
128
- file
129
- end
130
-
131
- @preinstall_file.path
132
- end
133
-
134
- def postinstall_file(config)
135
- @postinstall_file ||= begin
136
- source = File.join(data_dir, "hooks", "postinstall.sh")
137
- file = Tempfile.new("postinstall")
138
- file.write ERB.new(File.read(source)).result(config.sesame)
139
- file.rewind
140
- file
141
- end
142
-
143
- @postinstall_file.path
144
- end
145
-
146
- def dependencies(other_dependencies = nil)
147
- deps = YAML.load_file(File.join(data_dir, "dependencies.yml"))
148
- (deps["default"] || []) | (deps[codename] || []) | (other_dependencies || [])
149
- end
150
-
151
- def build_dependencies(other_dependencies = nil)
152
- deps = YAML.load_file(File.join(data_dir, "build_dependencies.yml"))
153
- (deps["default"] || []) | (deps[codename] || []) | (other_dependencies || [])
154
- end
155
-
156
- def data_file(name)
157
- File.new(File.join(data_dir, name))
158
- end
159
-
160
- def data_dir
161
- File.join(Pkgr.data_dir, "distributions", "debian")
162
- end
163
-
164
- protected
165
-
166
- def load_buildpack_list(config)
167
- file = config.buildpack_list || default_buildpack_list
168
- return [] if file.nil?
169
-
170
- File.read(file).split("\n").map do |line|
171
- url, *raw_env = line.split(",")
172
- buildpack_env = (config.env || Env.new).merge(Env.new(raw_env))
173
- Buildpack.new(url, :builtin, buildpack_env)
174
- end
27
+ %{fpm #{fpm_args(build_dir, config).join(" ")} .}
28
+ end
29
+
30
+ def fpm_args(build_dir, config)
31
+ args = []
32
+ args << "-t deb"
33
+ args << "-s dir"
34
+ args << "--verbose"
35
+ args << "--force"
36
+ args << %{-C "#{build_dir}"}
37
+ args << %{-n "#{config.name}"}
38
+ args << %{--version "#{config.version}"}
39
+ args << %{--iteration "#{config.iteration}"}
40
+ args << %{--url "#{config.homepage}"}
41
+ args << %{--provides "#{config.name}"}
42
+ args << %{--deb-user "root"}
43
+ args << %{--deb-group "root"}
44
+ args << %{--license "#{config.license}"} unless config.license.nil?
45
+ args << %{-a "#{config.architecture}"}
46
+ args << %{--description "#{config.description}"}
47
+ args << %{--maintainer "#{config.maintainer}"}
48
+ args << %{--template-scripts}
49
+ args << %{--before-install #{preinstall_file(config)}}
50
+ args << %{--after-install #{postinstall_file(config)}}
51
+ dependencies(config.dependencies).each{|d| args << "-d '#{d}'"}
52
+ args
175
53
  end
176
54
  end
177
55
  end
178
56
  end
179
57
 
180
- %w{debian_squeeze debian_wheezy ubuntu_lucid ubuntu_precise}.each do |distro|
181
- require "pkgr/distributions/#{distro}"
182
- end
58
+ require 'pkgr/distributions/ubuntu'
@@ -0,0 +1,51 @@
1
+ require 'pkgr/buildpack'
2
+ require 'pkgr/process'
3
+ require 'pkgr/distributions/base'
4
+
5
+ module Pkgr
6
+ module Distributions
7
+ # Contains the various components required to make a packaged app integrate well with a Debian system.
8
+ class Redhat < Base
9
+ # Only keep major adigits
10
+ def release
11
+ @release[/^[0-9]+/]
12
+ end
13
+
14
+ def runner
15
+ @runner ||= Runner.new("sysv", "lsb-3.1")
16
+ end
17
+
18
+ def package_test_command(package)
19
+ "rpm -qa '#{package}' | grep '#{package}' > /dev/null 2>&1"
20
+ end
21
+
22
+ def package_install_command(packages)
23
+ "sudo yum check-update && sudo yum install -y #{packages.map{|package| "\"#{package}\""}.join(" ")}"
24
+ end
25
+
26
+ def fpm_command(build_dir, config)
27
+ %{
28
+ fpm -t rpm -s dir --verbose --force \
29
+ -C "#{build_dir}" \
30
+ -n "#{config.name}" \
31
+ --version "#{config.version}" \
32
+ --iteration "#{config.iteration}" \
33
+ --url "#{config.homepage}" \
34
+ --provides "#{config.name}" \
35
+ --deb-user "root" \
36
+ --deb-group "root" \
37
+ -a "#{config.architecture}" \
38
+ --description "#{config.description}" \
39
+ --maintainer "#{config.maintainer}" \
40
+ --template-scripts \
41
+ --before-install #{preinstall_file(config)} \
42
+ --after-install #{postinstall_file(config)} \
43
+ #{dependencies(config.dependencies).map{|d| "-d '#{d}'"}.join(" ")} \
44
+ .
45
+ }
46
+ end
47
+ end
48
+ end
49
+ end
50
+
51
+ require 'pkgr/distributions/centos'
@@ -0,0 +1,39 @@
1
+ module Pkgr
2
+ module Distributions
3
+ class Runner < Struct.new(:type, :version)
4
+ def sysv?
5
+ type == "sysv"
6
+ end
7
+
8
+ def upstart?
9
+ type == "upstart"
10
+ end
11
+
12
+ def templates(process, app_name)
13
+ send("templates_#{type}", process, app_name)
14
+ end
15
+
16
+ private
17
+ def templates_sysv(process, app_name)
18
+ [
19
+ Templates::FileTemplate.new("sysv/#{app_name}", data_file("master.erb")),
20
+ Templates::FileTemplate.new("sysv/#{app_name}-#{process.name}", data_file("process_master.erb")),
21
+ Templates::FileTemplate.new("sysv/#{app_name}-#{process.name}-PROCESS_NUM", data_file("process.erb")),
22
+ ]
23
+ end
24
+
25
+ def templates_upstart(process, app_name)
26
+ [
27
+ Templates::FileTemplate.new("upstart/#{app_name}", data_file("init.d.sh.erb")),
28
+ Templates::FileTemplate.new("upstart/#{app_name}.conf", data_file("master.conf.erb")),
29
+ Templates::FileTemplate.new("upstart/#{app_name}-#{process.name}.conf", data_file("process_master.conf.erb")),
30
+ Templates::FileTemplate.new("upstart/#{app_name}-#{process.name}-PROCESS_NUM.conf", data_file("process.conf.erb"))
31
+ ]
32
+ end
33
+
34
+ def data_file(name)
35
+ File.new(File.join(Pkgr.data_dir, "init", type, version, name))
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,17 @@
1
+ require "pkgr/distributions/debian"
2
+
3
+ module Pkgr
4
+ module Distributions
5
+ # Contains the various components required to make a packaged app integrate well with a Ubuntu system.
6
+ class Ubuntu < Debian
7
+ # Keep everything
8
+ def release
9
+ @release
10
+ end
11
+
12
+ def runner
13
+ @runner ||= Runner.new("upstart", "1.5")
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,3 +1,3 @@
1
1
  module Pkgr
2
- VERSION = "1.2.0"
2
+ VERSION = "1.3.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pkgr
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-04-09 00:00:00.000000000 Z
12
+ date: 2014-05-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -135,39 +135,17 @@ extra_rdoc_files:
135
135
  - LICENSE
136
136
  - README.md
137
137
  files:
138
- - lib/pkgr/app.rb
139
138
  - lib/pkgr/builder.rb
140
139
  - lib/pkgr/buildpack.rb
141
140
  - lib/pkgr/cli.rb
142
141
  - lib/pkgr/config.rb
143
- - lib/pkgr/data/bin/executable
144
- - lib/pkgr/data/config/pre_boot.rb
145
- - lib/pkgr/data/distributions/debian/build_dependencies.yml
146
- - lib/pkgr/data/distributions/debian/buildpacks/debian_squeeze
147
- - lib/pkgr/data/distributions/debian/buildpacks/debian_wheezy
148
- - lib/pkgr/data/distributions/debian/buildpacks/ubuntu_lucid
149
- - lib/pkgr/data/distributions/debian/buildpacks/ubuntu_precise
150
- - lib/pkgr/data/distributions/debian/cron.d
151
- - lib/pkgr/data/distributions/debian/default.erb
152
- - lib/pkgr/data/distributions/debian/dependencies.yml
153
- - lib/pkgr/data/distributions/debian/hooks/postinstall.sh
154
- - lib/pkgr/data/distributions/debian/hooks/preinstall.sh
155
- - lib/pkgr/data/distributions/debian/logrotate.erb
156
- - lib/pkgr/data/distributions/debian/runner.erb
157
- - lib/pkgr/data/distributions/debian/sysv/master.erb
158
- - lib/pkgr/data/distributions/debian/sysv/process.erb
159
- - lib/pkgr/data/distributions/debian/sysv/process_master.erb
160
- - lib/pkgr/data/distributions/debian/upstart/init.d.sh.erb
161
- - lib/pkgr/data/distributions/debian/upstart/master.conf.erb
162
- - lib/pkgr/data/distributions/debian/upstart/process.conf.erb
163
- - lib/pkgr/data/distributions/debian/upstart/process_master.conf.erb
164
- - lib/pkgr/data/pkgr.yml
165
142
  - lib/pkgr/dispatcher.rb
143
+ - lib/pkgr/distributions/base.rb
144
+ - lib/pkgr/distributions/centos.rb
166
145
  - lib/pkgr/distributions/debian.rb
167
- - lib/pkgr/distributions/debian_squeeze.rb
168
- - lib/pkgr/distributions/debian_wheezy.rb
169
- - lib/pkgr/distributions/ubuntu_lucid.rb
170
- - lib/pkgr/distributions/ubuntu_precise.rb
146
+ - lib/pkgr/distributions/redhat.rb
147
+ - lib/pkgr/distributions/runner.rb
148
+ - lib/pkgr/distributions/ubuntu.rb
171
149
  - lib/pkgr/distributions.rb
172
150
  - lib/pkgr/env.rb
173
151
  - lib/pkgr/git.rb
@@ -176,6 +154,29 @@ files:
176
154
  - lib/pkgr/templates/file_template.rb
177
155
  - lib/pkgr/version.rb
178
156
  - lib/pkgr.rb
157
+ - data/build_dependencies/centos.yml
158
+ - data/build_dependencies/debian.yml
159
+ - data/build_dependencies/ubuntu.yml
160
+ - data/buildpacks/centos-6
161
+ - data/buildpacks/debian-6
162
+ - data/buildpacks/debian-7
163
+ - data/buildpacks/ubuntu-10.04
164
+ - data/buildpacks/ubuntu-12.04
165
+ - data/cli/cli.sh.erb
166
+ - data/dependencies/centos.yml
167
+ - data/dependencies/debian.yml
168
+ - data/dependencies/ubuntu.yml
169
+ - data/environment/default.erb
170
+ - data/hooks/postinstall.sh
171
+ - data/hooks/preinstall.sh
172
+ - data/init/sysv/lsb-3.1/master.erb
173
+ - data/init/sysv/lsb-3.1/process.erb
174
+ - data/init/sysv/lsb-3.1/process_master.erb
175
+ - data/init/upstart/1.5/init.d.sh.erb
176
+ - data/init/upstart/1.5/master.conf.erb
177
+ - data/init/upstart/1.5/process.conf.erb
178
+ - data/init/upstart/1.5/process_master.conf.erb
179
+ - data/logrotate/logrotate.erb
179
180
  - LICENSE
180
181
  - README.md
181
182
  - bin/pkgr
@@ -1,279 +0,0 @@
1
- require 'rake'
2
- require 'erb'
3
- require 'pkgr/version'
4
- require 'yaml'
5
-
6
- module Pkgr
7
- class App
8
- include RakeFileUtils
9
- attr_reader :root
10
- attr_reader :errors
11
- attr_reader :config
12
-
13
- # +root+: the root directory of the app.
14
- # +config+ a Configuration object, hosting the parameters defined in `config/pkgr.yml`.
15
- def initialize(root, config_path)
16
- @root = root
17
- load_config(config_path)
18
- @errors = []
19
- end
20
-
21
- def load_config(path)
22
- @config = YAML::load_file(path)
23
- raise ArgumentError, "The given configuration file at '#{path}' is not a well-formed YAML file. Please fix it or remove it and run 'rake pkgr:setup'" unless @config.kind_of?(Hash)
24
- @config['_path'] = path
25
- normalize_name!
26
- end
27
-
28
- def write_config
29
- File.open(@config['_path'] || raise("Don't know where to save myself!"), "w+") {|f|
30
- YAML.dump(@config.reject{|k,v| k == '_path'}, f)
31
- }
32
- end
33
-
34
- # Returns true if the app is correctly configured. Else otherwise.
35
- def valid?
36
- @errors.clear
37
- @errors.push("is not a valid git repository") unless File.exist?(File.join(@root, ".git", "HEAD"))
38
- @errors.push("must have a name") unless @config.fetch('name')
39
- @errors.push("must have a valid name ([a-zA-Z0-9_-])") unless @config.fetch('name').scan(/[^a-z0-9\_\-]/i)
40
- @errors.push("must have a version") unless @config.fetch('version')
41
- @errors.push("must have a valid target architecture") unless @config.fetch('architecture')
42
- @errors.empty?
43
- end
44
-
45
- def generate_required_files
46
- setup_debian
47
- setup_binary
48
- end
49
-
50
- def git_ref
51
- @config.fetch('git_ref') { 'HEAD' }
52
- end
53
-
54
- def prefix
55
- @config.fetch('prefix') { "/opt/local" }
56
- end
57
-
58
- def author_name
59
- @author_name ||= `git config --get user.name`.chomp
60
- end
61
-
62
- def author_email
63
- @author_email ||= `git config --get user.email`.chomp
64
- end
65
-
66
- def name
67
- @config['name']
68
- end
69
-
70
- def description
71
- @config['description'] || ""
72
- end
73
-
74
- def debian_build_dependencies(installable_only = false)
75
- deps = @config['debian_build_dependencies'] || []
76
- if installable_only
77
- deps = deps.reject{|d| d =~ /[\$\{\}]/}.map{|d| d.split(/\s/)[0]}
78
- end
79
- deps
80
- end
81
-
82
- def debian_runtime_dependencies(installable_only = false)
83
- deps = @config['debian_runtime_dependencies'] || []
84
- if installable_only
85
- deps = deps.reject{|d| d =~ /[\$\{\}]/}.map{|d| d.split(/\s/)[0]}
86
- end
87
- deps
88
- end
89
-
90
- def architecture
91
- @config['architecture'] || "all"
92
- end
93
-
94
- def homepage
95
- @config['homepage'] || ""
96
- end
97
-
98
- def config_files
99
- @config['config_files'] || []
100
- end
101
-
102
- def version
103
- @config['version']
104
- end
105
-
106
- def user
107
- @config.fetch('user') { name }
108
- end
109
-
110
- def group
111
- @config.fetch('group') { name }
112
- end
113
-
114
- # prefix without the leading slash.
115
- def pkg_prefix
116
- prefix[1..-1]
117
- end
118
-
119
- def setup_debian
120
- target = File.join(root, Pkgr::DEBIAN_DIR)
121
- Pkgr.mkdir(target)
122
-
123
- Dir[File.expand_path("../data/debian/*", __FILE__)].each do |file|
124
- case File.extname(file)
125
- when ".erb"
126
- file_target = File.join(target, File.basename(file, ".erb"))
127
- File.open(file_target, "w+") do |f|
128
- f << ERB.new(File.read(file)).result(binding)
129
- end
130
- else
131
- file_target = File.join(target, File.basename(file))
132
- if File.exist?(file_target)
133
- puts "File #{file_target} already exists. Skipped."
134
- else
135
- FileUtils.cp(file, file_target, :verbose => true)
136
- end
137
- end
138
- end
139
-
140
- puts "Correctly set up debian files."
141
- end
142
-
143
- # Creates an executable file for easy launch of the server/console/rake tasks once it is installed.
144
- # E.g. /usr/bin/my-app console, /usr/bin/my-app server start -p 8080
145
- def setup_binary
146
- target = File.join(root, "bin", name)
147
- Pkgr.mkdir(File.dirname(target))
148
- FileUtils.cp(File.expand_path("../data/bin/executable", __FILE__), target, :verbose => true)
149
- FileUtils.chmod 0755, target, :verbose => true
150
- puts "Correctly set up executable file. Try running './bin/#{name} console'."
151
- end
152
-
153
- # FIXME: this is ugly
154
- def bump!(version_index = :patch, new_version = nil)
155
- unless version_index == :custom
156
- indices = [:major, :minor, :patch]
157
- index = indices.index(version_index) || raise(ArgumentError, "The given version index is not valid (#{version_index})")
158
- fragments = version.split(".")
159
- fragments[index] = fragments[index].to_i+1
160
- ((index+1)..2).each{|i|
161
- fragments[i] = 0
162
- }
163
- new_version = fragments.join(".")
164
- else
165
- raise ArgumentError, "new_version must not be nil when bumping with a :custom version" if new_version.nil?
166
- end
167
-
168
- changelog = File.read(debian_file("changelog"))
169
- dist = (changelog.scan(/#{name} \(#{new_version}-(\d+)\)/).flatten[0].to_i)
170
- dist += 1 if new_version == version
171
- dist = 1 if dist == 0
172
-
173
- last_commit = changelog.scan(/\s+\* ([a-z0-9]{7}) /).flatten[0]
174
-
175
- cmd = "git log --oneline"
176
- cmd << " #{last_commit}..#{git_ref}" unless last_commit.nil?
177
- result = %x{#{cmd}}
178
- ok = $?.exitstatus == 0
179
- if !ok
180
- raise "Command failed. Aborting."
181
- else
182
- content_changelog = [
183
- "#{name} (#{new_version}-#{dist}) unstable; urgency=low",
184
- "",
185
- result.split("\n").reject{|l| l =~ / v#{version}/}.map{|l| " * #{l}"}.join("\n"),
186
- "",
187
- " -- #{author_name} <#{author_email}> #{Time.now.strftime("%a, %d %b %Y %H:%M:%S %z")}",
188
- "",
189
- changelog
190
- ].join("\n")
191
-
192
- File.open(debian_file("changelog"), "w+") do |f|
193
- f << content_changelog
194
- end
195
-
196
- @config['version'] = new_version
197
- write_config
198
-
199
- puts "Committing changelog and version file..."
200
- files_to_commit = [debian_file('changelog'), @config['_path']]
201
- sh "git add #{files_to_commit.join(" ")} && git commit -m '[pkgr] v#{new_version}-#{dist}' #{files_to_commit.join(" ")}"
202
- end
203
- end
204
-
205
- def build_debian_package(host)
206
- puts "Building debian package on '#{host}'..."
207
- Dir.chdir(root) do
208
- Pkgr.mkdir("pkg")
209
- archive = "#{name}-#{version}"
210
- sh "scp #{File.expand_path("../data/config/pre_boot.rb", __FILE__)} #{host}:/tmp/"
211
- cmd = %Q{
212
- git archive #{git_ref} --prefix=#{archive}/ | ssh #{host} 'cat - > /tmp/#{archive}.tar &&
213
- set -x && rm -rf /tmp/#{archive} &&
214
- cd /tmp && tar xf #{archive}.tar && cd #{archive} &&
215
- cat config/boot.rb >> /tmp/pre_boot.rb && cp -f /tmp/pre_boot.rb config/boot.rb &&
216
- #{debian_steps.join(" &&\n")}'
217
- }
218
- sh cmd
219
- # Fetch all package files, and put it in the `pkg` directory
220
- sh "scp #{host}:/tmp/#{name}_#{version}* pkg/"
221
- end
222
- end
223
-
224
- def debian_steps
225
- target_vendor = "vendor/bundle/ruby/1.9.1"
226
- [
227
- # "sudo apt-get install #{debian_runtime_dependencies(true).join(" ")} -y",
228
- "sudo apt-get install #{debian_build_dependencies(true).join(" ")} -y",
229
- # Vendor bundler
230
- "gem1.9.1 install bundler --no-ri --no-rdoc --version #{bundler_version} -i #{target_vendor}",
231
- "GEM_HOME='#{target_vendor}' #{target_vendor}/bin/bundle install --deployment --without test development",
232
- "rm -rf #{target_vendor}/{cache,doc}",
233
- "dpkg-buildpackage -us -uc -d"
234
- ]
235
- end
236
-
237
- def release_debian_package(host, apt_directory = nil)
238
- apt_directory ||= "/var/www/#{name}"
239
- latest = Dir[File.join(root, "pkg", "*.deb")].find{|file| file =~ /#{version}/}
240
- raise "No .deb available in pkg/" if latest.nil?
241
- latest_name = File.basename(latest)
242
- sh "scp #{latest} #{host}:/tmp/"
243
- sh "ssh #{host} 'sudo mkdir -p #{apt_directory} && sudo chown $USER #{apt_directory} && mv /tmp/#{latest_name} #{apt_directory} && cd #{apt_directory} && ( which dpkg-scanpackages || sudo apt-get update && sudo apt-get install dpkg-dev -y ) && dpkg-scanpackages . | gzip -f9 > Packages.gz'"
244
- puts "****"
245
- puts "Now you just need to serve the '#{apt_directory}' directory over HTTP, and add a new source to your APT configuration on the production server:"
246
- puts "$ cat /etc/apt/sources.list.d/#{name}.list"
247
- puts "deb http://apt-server.ltd/#{name} /"
248
- puts
249
- puts "And then:"
250
- puts "$ sudo apt-get update && sudo apt-get install #{name}"
251
- puts "****"
252
- end
253
-
254
- private
255
- def bundler_version
256
- @config.fetch('bundler_version') { '1.3.5' }
257
- end
258
-
259
- def debian_file(filename)
260
- file = File.join(root, Pkgr::DEBIAN_DIR, filename)
261
- raise "The debian/changelog file does not exist. Please generate it first." unless File.exist?(file)
262
- file
263
- end
264
-
265
- def normalize_name!
266
- # debian packages can not contain capitalized letters nor underscores
267
- if (raw_name = @config.fetch('name', '')) =~ /[A-Z_-]/
268
- normalized_name = raw_name.
269
- gsub(/[A-Z]/) { |m| "_#{m.downcase}" }. # underscore each word
270
- gsub(/[_-]+/, '-'). # normalize underscores/dashes
271
- sub(/^-/, '') # strip leading dash
272
- puts "Normalized application name to %s (original: %s)." % [
273
- normalized_name.inspect, raw_name.inspect
274
- ] unless normalized_name == raw_name
275
- @config['name'] = normalized_name
276
- end
277
- end
278
- end
279
- end