Class: Dodebui::Distribution
- Inherits:
-
Object
- Object
- Dodebui::Distribution
- Defined in:
- lib/dodebui/distribution.rb
Overview
handle distribution releases
Instance Attribute Summary collapse
-
#cli ⇒ Object
readonly
Returns the value of attribute cli.
-
#codename ⇒ Object
readonly
Returns the value of attribute codename.
-
#os ⇒ Object
readonly
Returns the value of attribute os.
Instance Method Summary collapse
- #apt_proxy ⇒ Object
- #base_image_name ⇒ Object
- #build ⇒ Object
- #codename_int ⇒ Object
- #codename_str ⇒ Object
- #create_image ⇒ Object
- #create_image_build(dir) ⇒ Object
- #create_image_copy_dep_resolver(dir) ⇒ Object
- #create_image_dockerfile_contents ⇒ Object
- #ensure_image_updated ⇒ Object
- #image_age(i) ⇒ Object
- #image_name ⇒ Object
-
#initialize(name, cli) ⇒ Distribution
constructor
A new instance of Distribution.
- #logger ⇒ Object
- #pbuilder_dir ⇒ Object
- #pbuilder_files ⇒ Object
- #repo_name ⇒ Object
- #share_path ⇒ Object
Constructor Details
#initialize(name, cli) ⇒ Distribution
Returns a new instance of Distribution.
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
# File 'lib/dodebui/distribution.rb', line 26 def initialize(name, cli) @cli = cli # convert string if name.is_a? String split = name.split(':') os = split[0].to_sym codename = split[1].to_sym end if (!DISTRIBUTIONS.key? os) || (!DISTRIBUTIONS[os].include? codename) fail "Operating system #{os} with codename #{codename} not found" end @os = os @codename = codename end |
Instance Attribute Details
#cli ⇒ Object (readonly)
Returns the value of attribute cli.
25 26 27 |
# File 'lib/dodebui/distribution.rb', line 25 def cli @cli end |
#codename ⇒ Object (readonly)
Returns the value of attribute codename.
25 26 27 |
# File 'lib/dodebui/distribution.rb', line 25 def codename @codename end |
#os ⇒ Object (readonly)
Returns the value of attribute os.
25 26 27 |
# File 'lib/dodebui/distribution.rb', line 25 def os @os end |
Instance Method Details
#apt_proxy ⇒ Object
93 94 95 96 97 98 99 100 101 |
# File 'lib/dodebui/distribution.rb', line 93 def apt_proxy ( 'echo ' \ '"Acquire::http::Proxy ' \ '\"%s\";" ' \ '> ' \ '/etc/apt/apt.conf.d/01proxy' ) % @cli.apt_proxy end |
#base_image_name ⇒ Object
179 180 181 |
# File 'lib/dodebui/distribution.rb', line 179 def base_image_name "#{@os}:#{@codename}" end |
#build ⇒ Object
171 172 173 |
# File 'lib/dodebui/distribution.rb', line 171 def build @build ||= Build.new self end |
#codename_int ⇒ Object
50 51 52 |
# File 'lib/dodebui/distribution.rb', line 50 def codename_int DISTRIBUTIONS[os].index(codename) + 1 end |
#codename_str ⇒ Object
46 47 48 |
# File 'lib/dodebui/distribution.rb', line 46 def codename_str format('%02d', codename_int) end |
#create_image ⇒ Object
153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 |
# File 'lib/dodebui/distribution.rb', line 153 def create_image logger.info("Start building a new image from #{base_image_name}") # build docker build directory Dir.mktmpdir do |dir| # Write docker file dockerfile_path = File.join(dir, 'Dockerfile') File.open(dockerfile_path, 'w') do |file| file.write(create_image_dockerfile_contents) end create_image_copy_dep_resolver(dir) # build image create_image_build(dir) end end |
#create_image_build(dir) ⇒ Object
137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
# File 'lib/dodebui/distribution.rb', line 137 def create_image_build(dir) image = Docker::Image.build_from_dir( dir, nocache: true ) logger.info( "Finished building a new image #{image_name} from #{base_image_name}" ) image.tag( repo: repo_name, tag: @codename.to_s, force: true ) end |
#create_image_copy_dep_resolver(dir) ⇒ Object
128 129 130 131 132 133 134 135 |
# File 'lib/dodebui/distribution.rb', line 128 def create_image_copy_dep_resolver(dir) pbuilder_files.each do |file| src = File.join(share_path, 'pbuilder', file) dest = File.join(dir, file) logger.debug("Copy file from #{src} to #{dest}") FileUtils.cp src, dest end end |
#create_image_dockerfile_contents ⇒ Object
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
# File 'lib/dodebui/distribution.rb', line 103 def create_image_dockerfile_contents dockerfile = "FROM #{base_image_name}\n" # append proxy if needed dockerfile += "RUN #{apt_proxy}\n" unless @cli.apt_proxy.nil? dockerfile += ( "ENV DEBIAN_FRONTEND=noninteractive\n" \ "RUN apt-get update && \\ \n" \ " apt-get -y dist-upgrade && \\ \n" \ " apt-get -y install wget curl build-essential aptitude \n" \ "RUN mkdir -p #{pbuilder_dir}\n" ) # add pbuilder dep resolver pbuilder_files.each do |file| dockerfile += "ADD #{file} #{pbuilder_dir}/#{file}\n" end # make dep resolver executable dockerfile += 'RUN chmod +x ' dockerfile += "#{pbuilder_dir}/pbuilder-satisfydepends-aptitude\n" dockerfile end |
#ensure_image_updated ⇒ Object
59 60 61 62 63 64 65 66 67 68 |
# File 'lib/dodebui/distribution.rb', line 59 def ensure_image_updated # Test if image_name exists @image = Docker::Image.get(image_name) if image_age(@image) > MAX_IMAGE_AGE logger.info "Image #{image_name} is outdated renew it" @image = create_image end rescue Docker::Error::NotFoundError @image = create_image end |
#image_age(i) ⇒ Object
54 55 56 57 |
# File 'lib/dodebui/distribution.rb', line 54 def image_age(i) age = DateTime.now - DateTime.parse(i.info['Created']) (age * 24 * 60 * 60).to_i end |
#image_name ⇒ Object
183 184 185 |
# File 'lib/dodebui/distribution.rb', line 183 def image_name "#{repo_name}:#{@codename}" end |
#logger ⇒ Object
42 43 44 |
# File 'lib/dodebui/distribution.rb', line 42 def logger @cli.logger end |
#pbuilder_dir ⇒ Object
89 90 91 |
# File 'lib/dodebui/distribution.rb', line 89 def pbuilder_dir '/usr/lib/pbuilder' end |
#pbuilder_files ⇒ Object
70 71 72 73 74 75 76 |
# File 'lib/dodebui/distribution.rb', line 70 def pbuilder_files [ 'pbuilder-satisfydepends-aptitude', 'pbuilder-satisfydepends-checkparams', 'pbuilder-satisfydepends-funcs' ] end |
#repo_name ⇒ Object
175 176 177 |
# File 'lib/dodebui/distribution.rb', line 175 def repo_name "dodebui_#{@os}" end |
#share_path ⇒ Object
78 79 80 81 82 83 84 85 86 87 |
# File 'lib/dodebui/distribution.rb', line 78 def share_path File.( File.join( File.( File.dirname(__FILE__) ), '../../share' ) ) end |