dodebui 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 040519848fb5a241f48c418cf81862520214684e
4
- data.tar.gz: 3a7c0405fbb3f1918ee8732c5f2d3478036c60b3
3
+ metadata.gz: f7c7448d8bf5f96444aa24bf6c0a450bba189772
4
+ data.tar.gz: c4318110ee5b9ff37ca363862e4d5105a580c6cd
5
5
  SHA512:
6
- metadata.gz: 05e200181bce533f3038d6ae62b55d665ea1ab84ec17892d3ef8a3930d60f62a7d73ca7fa2076f5fa6d15fc1ddef4830f0b894135eb39f457ce7a490d37f1773
7
- data.tar.gz: aefd6b2cb795837bc3559d63c3adbcfd17d67018495b22af725fcca64fb72a52360fc92f50e8760e0fd3ca40c88d34681169b4f61f830aad6f820a31090bcdd2
6
+ metadata.gz: c6d2e32bbe71cd8b9440843665749e3ff91edbb14bbad398516ca738fdc7f31f528f6037cbd77ec4dafcf42f4ca05c7e4ad65ca8b2295839a0617405e82734e6
7
+ data.tar.gz: a23cacd8f986ae8f33365c7ebcab6dd73860ab3bae9a03d198c8feb026302332ed514b6297848dcf1dd2a41c36be71efc881ed09a738469306ee412015cc5878
data/.rubocop.yml CHANGED
@@ -1,4 +1,4 @@
1
1
  Metrics/ClassLength:
2
- Max: 180
2
+ Max: 250
3
3
  Metrics/MethodLength:
4
4
  Max: 20
data/README.md CHANGED
@@ -1,26 +1,61 @@
1
1
  # Dodebui
2
2
 
3
- TODO: Write a gem description
3
+ Debian Docker builder
4
+
5
+ This tool helps to build Debian binary packages for multiple distribution
6
+ releases.
7
+
8
+ ## Features
9
+
10
+ ### Implemented
11
+
12
+ * build multiple a package for multiple releases in parallel
13
+ * use docker containers for isolation
14
+ * install dependencies automatically
15
+ * use a apt cache for minimizing download times
16
+
17
+ ### Planned
18
+
19
+ * Cache images after dependency installation for faster build times
4
20
 
5
21
  ## Installation
6
22
 
7
- Add this line to your application's Gemfile:
23
+ Add this Gemfile to your debian packge:
8
24
 
9
25
  ```ruby
26
+ source 'https://rubygems.org'
10
27
  gem 'dodebui'
11
28
  ```
12
29
 
13
30
  And then execute:
14
31
 
15
- $ bundle
32
+ $ bundle install
16
33
 
17
- Or install it yourself as:
34
+ Now create your Dodebuifile in project root:
18
35
 
19
- $ gem install dodebui
36
+ ```ruby
37
+ # vim: ft=ruby
38
+
39
+ # Configure distributions to build
40
+ @build_distributions = [
41
+ 'debian:wheezy',
42
+ 'debian:jessie',
43
+ 'debian:squeeze',
44
+ 'ubuntu:precise',
45
+ 'ubuntu:trusty',
46
+ ]
47
+
48
+ # Configure a apt-proxy (warmly recommended)
49
+ #@apt_proxy = 'http://my-apt-proxy.com/'
50
+ ```
20
51
 
21
52
  ## Usage
22
53
 
23
- TODO: Write usage instructions here
54
+ $ bundle exec dodebui
55
+
56
+ ## Example project
57
+
58
+ https://github.com/simonswine/dodebui-package-hello
24
59
 
25
60
  ## Contributing
26
61
 
data/lib/dodebui/build.rb CHANGED
@@ -46,7 +46,6 @@ module Dodebui
46
46
  )
47
47
  logger.info("Starting container #{@distribution.codename}")
48
48
  @container.start('Binds' => [
49
- "#{File.join(cache_dir, 'archives')}:/var/cache/apt/archives",
50
49
  "#{build_dir}:/_build"
51
50
  ])
52
51
  end
@@ -77,18 +76,65 @@ module Dodebui
77
76
  logger.info("Finished building package #{@distribution.codename}")
78
77
  end
79
78
 
79
+ def build_apt_proxy
80
+ return if @cli.apt_proxy.nil?
81
+ logger.info("Setting apt_proxy #{@distribution.codename}")
82
+ stdout, stderr, ret_val = @container.exec([
83
+ 'bash',
84
+ '-c',
85
+ @distribution.apt_proxy
86
+ ])
87
+ write_log('apt_proxy', stdout, stderr)
88
+ logger.warn(
89
+ "Failed setting apt proxy #{@distribution.codename}"
90
+ ) if ret_val != 0
91
+ end
92
+
93
+ def build_chown
94
+ uid = Process.uid
95
+ gid = Process.gid
96
+ logger.info(
97
+ 'Changing owner of build dir to' \
98
+ " uid=#{uid} gid=#{gid} #{@distribution.codename}"
99
+ )
100
+ stdout, stderr, ret_val = @container.exec([
101
+ 'chown',
102
+ '-R',
103
+ format('%d:%d', uid, gid),
104
+ '/_build'
105
+ ])
106
+ write_log('chown', stdout, stderr)
107
+ logger.warn(
108
+ "Failed changing owner of build dir #{@distribution.codename}"
109
+ ) if ret_val != 0
110
+ end
111
+
112
+ def build_error(e)
113
+ logger.warn("Error building #{@distribution.image_name}: #{e}")
114
+ return false if @container.nil?
115
+ logger.warn("Use container id=#{@container.id} to debug")
116
+ @container.stop
117
+ false
118
+ end
119
+
80
120
  def build
81
121
  build_container_create_start
82
122
 
123
+ build_apt_proxy
124
+
83
125
  build_dependencies
84
126
 
85
127
  build_package
86
128
 
129
+ build_chown
130
+
87
131
  @container.stop
88
132
 
133
+ @container.remove
134
+
89
135
  true
90
- rescue RuntimeError
91
- false
136
+ rescue RuntimeError => e
137
+ build_error(e)
92
138
  end
93
139
 
94
140
  def cache_dir
@@ -144,6 +190,7 @@ module Dodebui
144
190
  end
145
191
 
146
192
  def source_templates
193
+ return if @cli.source_templates.nil?
147
194
  @cli.source_templates.each do |template|
148
195
  src = File.join(source_dir, template)
149
196
  dest = src[0...-4]
data/lib/dodebui/cli.rb CHANGED
@@ -6,7 +6,7 @@ require 'docker'
6
6
  module Dodebui
7
7
  ## commandline interface for dodebui
8
8
  class Cli
9
- attr_accessor :source_templates, :build_distributions
9
+ attr_accessor :source_templates, :build_distributions, :apt_proxy
10
10
  attr_reader :wd
11
11
 
12
12
  def self.logger
@@ -16,6 +16,7 @@ module Dodebui
16
16
  def initialize
17
17
  @dodebuifiles ||= ['Dodebuifile']
18
18
  @original_dir = Dir.getwd
19
+ @distributions_sem = Mutex.new
19
20
  end
20
21
 
21
22
  def dodebuifile?
@@ -92,10 +93,18 @@ module Dodebui
92
93
  threads = []
93
94
  @distributions.each do |dist|
94
95
  threads << Thread.new do
95
- dist.ensure_image_updated
96
+ begin
97
+ dist.ensure_image_updated
98
+ rescue => e
99
+ logger.warn(
100
+ "Failed ensuring a updated image '#{dist.image_name}': #{e}"
101
+ )
102
+ @distributions_sem.synchronize do
103
+ @distributions -= [dist]
104
+ end
105
+ end
96
106
  end
97
107
  end
98
-
99
108
  # wait for all threads
100
109
  threads.each(&:join)
101
110
  end
@@ -110,7 +119,14 @@ module Dodebui
110
119
  threads = []
111
120
  @distributions.each do |dist|
112
121
  threads << Thread.new do
113
- dist.build.build
122
+ begin
123
+ dist.build.build
124
+ rescue => e
125
+ logger.warn("Failed building on image '#{dist.image_name}': #{e}")
126
+ @distributions_sem.synchronize do
127
+ @distributions -= [dist]
128
+ end
129
+ end
114
130
  end
115
131
  end
116
132
  # wait for all threads
@@ -90,9 +90,23 @@ module Dodebui
90
90
  '/usr/lib/pbuilder'
91
91
  end
92
92
 
93
+ def apt_proxy
94
+ (
95
+ 'echo ' \
96
+ '"Acquire::http::Proxy ' \
97
+ '\"%s\";" ' \
98
+ '> ' \
99
+ '/etc/apt/apt.conf.d/01proxy'
100
+ ) % @cli.apt_proxy
101
+ end
102
+
93
103
  def create_image_dockerfile_contents
94
- dockerfile = (
95
- "FROM #{base_image_name}\n" \
104
+ dockerfile = "FROM #{base_image_name}\n"
105
+
106
+ # append proxy if needed
107
+ dockerfile += "RUN #{apt_proxy}\n" unless @cli.apt_proxy.nil?
108
+
109
+ dockerfile += (
96
110
  "ENV DEBIAN_FRONTEND=noninteractive\n" \
97
111
  "RUN apt-get update && \\ \n" \
98
112
  " apt-get -y dist-upgrade && \\ \n" \
@@ -1,4 +1,4 @@
1
1
  # version of gem
2
2
  module Dodebui
3
- VERSION = '0.0.1'
3
+ VERSION = '0.0.2'
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dodebui
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Christian Simon
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-08 00:00:00.000000000 Z
11
+ date: 2015-04-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: docker-api