nutkins 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/nutkins/docker_builder.rb +55 -56
- data/lib/nutkins/version.rb +1 -1
- data/lib/nutkins.rb +11 -5
- metadata +2 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 69265ab31556f8e5e183ff64ce97bd771a7126ea
         | 
| 4 | 
            +
              data.tar.gz: 4ed7e202dc0dc4a1ccc7338b4869f2ea2d314c64
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: bb313cc3b14afc954f49518aafd2712fe2db1bde0fb03b3c12317ce6544c019f089bf867b469d65c01bf19f5667473e6e6ee4974603006a17f75a330164b1bf5
         | 
| 7 | 
            +
              data.tar.gz: 48654d38201f36f9659781cccc7b358b8417ddd5fe0647926f60cc6fecd5a5675e59cbeb2924234c7732a0f80a6d9487b221a252bba05ff79fef60dbebde0eb7
         | 
| @@ -15,16 +15,8 @@ module Nutkins::DockerBuilder | |
| 15 15 | 
             
                  Docker.run 'pull', base, stdout: true
         | 
| 16 16 | 
             
                end
         | 
| 17 17 |  | 
| 18 | 
            -
                cont_id = Nutkins::Docker.container_id_for_tag base, running: true
         | 
| 19 | 
            -
                if cont_id
         | 
| 20 | 
            -
                  puts "found existing container #{cont_id}"
         | 
| 21 | 
            -
                  Nutkins::Docker.kill_and_remove_container cont_id
         | 
| 22 | 
            -
                  puts "killed and removed existing container"
         | 
| 23 | 
            -
                end
         | 
| 24 | 
            -
             | 
| 25 18 | 
             
                # the base image to start rebuilding from
         | 
| 26 19 | 
             
                parent_img_id = base
         | 
| 27 | 
            -
                cont_id = nil
         | 
| 28 20 | 
             
                pwd = Dir.pwd
         | 
| 29 21 | 
             
                begin
         | 
| 30 22 | 
             
                  Dir.chdir cfg["directory"]
         | 
| @@ -34,87 +26,94 @@ module Nutkins::DockerBuilder | |
| 34 26 | 
             
                  build_commands.each do |build_cmd|
         | 
| 35 27 | 
             
                    cmd = /^\w+/.match(build_cmd).to_s.downcase
         | 
| 36 28 | 
             
                    cmd_args = build_cmd[(cmd.length + 1)..-1].strip
         | 
| 37 | 
            -
             | 
| 38 | 
            -
                     | 
| 39 | 
            -
                     | 
| 40 | 
            -
                     | 
| 41 | 
            -
                     | 
| 29 | 
            +
                    # docker run is always used and forms the basis of the cache key
         | 
| 30 | 
            +
                    run_args = nil
         | 
| 31 | 
            +
                    env_args = nil
         | 
| 32 | 
            +
                    add_files = nil
         | 
| 33 | 
            +
                    add_files_dest = nil
         | 
| 42 34 |  | 
| 43 35 | 
             
                    case cmd
         | 
| 44 36 | 
             
                    when "run"
         | 
| 45 37 | 
             
                      cmd_args.gsub! /\n+/, ' '
         | 
| 46 | 
            -
                       | 
| 47 | 
            -
                      commit_msg = cmd + ' ' + cmd_args
         | 
| 38 | 
            +
                      run_args = cmd_args
         | 
| 48 39 | 
             
                    when "add"
         | 
| 49 | 
            -
                      * | 
| 50 | 
            -
                       | 
| 51 | 
            -
             | 
| 52 | 
            -
                      docker_args = srcs.map { |src| ['cp', src, '%CONT_ID%' + ':' + dest] }
         | 
| 53 | 
            -
                      # ensure checksum of each file is embedded into commit_msg
         | 
| 40 | 
            +
                      *add_files, add_files_dest = cmd_args.split ' '
         | 
| 41 | 
            +
                      add_files = add_files.map { |src| Dir.glob src }.flatten
         | 
| 42 | 
            +
                      # ensure checksum of each file is embedded into run command
         | 
| 54 43 | 
             
                      # if any file changes the cache is dirtied
         | 
| 55 | 
            -
                       | 
| 44 | 
            +
                      run_args = '#(nop) add ' + add_files.map do |src|
         | 
| 56 45 | 
             
                        src + ':' + Digest::MD5.file(src).to_s
         | 
| 57 | 
            -
                      end.push( | 
| 46 | 
            +
                      end.push(add_files_dest).join(' ')
         | 
| 58 47 | 
             
                    when "cmd", "entrypoint", "env", "expose", "label", "onbuild", "user", "volume", "workdir"
         | 
| 59 | 
            -
                       | 
| 48 | 
            +
                      run_args = "#(nop) #{build_cmd}"
         | 
| 49 | 
            +
                      env_args = build_cmd
         | 
| 60 50 | 
             
                    else
         | 
| 61 51 | 
             
                      raise "unsupported command: #{cmd}"
         | 
| 62 52 | 
             
                      # TODO add metadata flags
         | 
| 63 53 | 
             
                    end
         | 
| 64 54 |  | 
| 65 | 
            -
                    if  | 
| 66 | 
            -
                       | 
| 67 | 
            -
             | 
| 55 | 
            +
                    if run_args
         | 
| 56 | 
            +
                      run_shell_cmd = [ cfg['shell'], '-c', run_args ]
         | 
| 68 57 | 
             
                      unless cache_is_dirty
         | 
| 69 58 | 
             
                        # searches the commit messages of all images for the one matching the expected
         | 
| 70 59 | 
             
                        # cache entry for the given content
         | 
| 71 | 
            -
                         | 
| 72 | 
            -
                        images_meta = JSON.parse(Nutkins::Docker.run_get_stdout('inspect', *all_images))
         | 
| 73 | 
            -
                        cache_entry = images_meta.find do |image_meta|
         | 
| 74 | 
            -
                          if image_meta['Comment'] == commit_msg
         | 
| 75 | 
            -
                            parent_img_id = Nutkins::Docker.get_short_commit(image_meta['Id'])
         | 
| 76 | 
            -
                            true
         | 
| 77 | 
            -
                          end
         | 
| 78 | 
            -
                        end
         | 
| 60 | 
            +
                        cache_img_id = find_cached_img_id run_shell_cmd
         | 
| 79 61 |  | 
| 80 | 
            -
                        if  | 
| 81 | 
            -
                          puts "cached: #{ | 
| 62 | 
            +
                        if cache_img_id
         | 
| 63 | 
            +
                          puts "cached: #{run_args}"
         | 
| 64 | 
            +
                          parent_img_id = cache_img_id
         | 
| 82 65 | 
             
                          next
         | 
| 83 66 | 
             
                        else
         | 
| 84 | 
            -
                          puts " | 
| 85 | 
            -
                          Nutkins::Docker.run 'run', '-d', parent_img_id, 'sleep', '3600'
         | 
| 86 | 
            -
                          cont_id = Nutkins::Docker.container_id_for_tag parent_img_id, running: true
         | 
| 87 | 
            -
                          puts "started build container #{cont_id}"
         | 
| 67 | 
            +
                          puts "not in cache, starting from #{parent_img_id}"
         | 
| 88 68 | 
             
                          cache_is_dirty = true
         | 
| 89 69 | 
             
                        end
         | 
| 90 70 | 
             
                      end
         | 
| 91 71 |  | 
| 92 | 
            -
                       | 
| 72 | 
            +
                      if run_args
         | 
| 73 | 
            +
                        puts "run #{run_args}"
         | 
| 74 | 
            +
                        unless Nutkins::Docker.run 'run', parent_img_id, *run_shell_cmd, stdout: true
         | 
| 75 | 
            +
                          raise "run failed: #{run_args}"
         | 
| 76 | 
            +
                        end
         | 
| 77 | 
            +
             | 
| 78 | 
            +
                        cont_id = `docker ps -aq`.lines.first.strip
         | 
| 79 | 
            +
                        begin
         | 
| 80 | 
            +
                          if add_files
         | 
| 81 | 
            +
                            add_files.each do |src|
         | 
| 82 | 
            +
                              if not Nutkins::Docker.run 'cp', src, "#{cont_id}:#{add_files_dest}"
         | 
| 83 | 
            +
                                raise "could not copy #{src} to #{cont_id}:#{add_files_dest}"
         | 
| 84 | 
            +
                              end
         | 
| 85 | 
            +
                            end
         | 
| 86 | 
            +
                          end
         | 
| 93 87 |  | 
| 94 | 
            -
             | 
| 95 | 
            -
             | 
| 96 | 
            -
             | 
| 97 | 
            -
             | 
| 98 | 
            -
             | 
| 99 | 
            -
                           | 
| 100 | 
            -
             | 
| 101 | 
            -
                            raise "build failed: #{one_docker_args.join ' '}"
         | 
| 88 | 
            +
                          commit_args = env_args ? ['-c', env_args] : []
         | 
| 89 | 
            +
                          parent_img_id = Nutkins::Docker.run_get_stdout 'commit', *commit_args, cont_id
         | 
| 90 | 
            +
                          raise "could not commit docker image" if parent_img_id.nil?
         | 
| 91 | 
            +
                          parent_img_id = Nutkins::Docker.get_short_commit parent_img_id
         | 
| 92 | 
            +
                        ensure
         | 
| 93 | 
            +
                          if not Nutkins::Docker.run 'rm', cont_id
         | 
| 94 | 
            +
                            puts "could not remove build container #{cont_id}"
         | 
| 102 95 | 
             
                          end
         | 
| 103 96 | 
             
                        end
         | 
| 104 97 | 
             
                      end
         | 
| 105 | 
            -
             | 
| 106 | 
            -
                      commit_args = commit_change ? ['-c', commit_change] : []
         | 
| 107 | 
            -
                      parent_img_id = Nutkins::Docker.run_get_stdout 'commit', '-m', commit_msg, *commit_args, cont_id
         | 
| 108 | 
            -
                      raise "could not commit docker image" if parent_img_id.nil?
         | 
| 109 | 
            -
                      parent_img_id = Nutkins::Docker.get_short_commit parent_img_id
         | 
| 110 98 | 
             
                    else
         | 
| 111 99 | 
             
                      puts "TODO: support cmd #{build_cmd}"
         | 
| 112 100 | 
             
                    end
         | 
| 113 101 | 
             
                  end
         | 
| 114 102 | 
             
                ensure
         | 
| 115 103 | 
             
                  Dir.chdir pwd
         | 
| 116 | 
            -
                  Nutkins::Docker.kill_and_remove_container cont_id if cont_id
         | 
| 117 | 
            -
                  puts "killed and removed build container"
         | 
| 118 104 | 
             
                end
         | 
| 105 | 
            +
             | 
| 106 | 
            +
                Nutkins::Docker.run 'tag', parent_img_id, cfg['tag']
         | 
| 107 | 
            +
              end
         | 
| 108 | 
            +
             | 
| 109 | 
            +
              def self.find_cached_img_id command
         | 
| 110 | 
            +
                all_images = Nutkins::Docker.run_get_stdout('images', '-aq').split("\n")
         | 
| 111 | 
            +
                images_meta = JSON.parse(Nutkins::Docker.run_get_stdout('inspect', *all_images))
         | 
| 112 | 
            +
                images_meta.each do |image_meta|
         | 
| 113 | 
            +
                  if image_meta.dig('ContainerConfig', 'Cmd') == command
         | 
| 114 | 
            +
                    return Nutkins::Docker.get_short_commit(image_meta['Id'])
         | 
| 115 | 
            +
                  end
         | 
| 116 | 
            +
                end
         | 
| 117 | 
            +
                nil
         | 
| 119 118 | 
             
              end
         | 
| 120 119 | 
             
            end
         | 
    
        data/lib/nutkins/version.rb
    CHANGED
    
    
    
        data/lib/nutkins.rb
    CHANGED
    
    | @@ -57,11 +57,17 @@ module Nutkins | |
| 57 57 | 
             
                  end
         | 
| 58 58 |  | 
| 59 59 | 
             
                  image_id = Docker.image_id_for_tag tag
         | 
| 60 | 
            -
                  if prev_image_id | 
| 61 | 
            -
                     | 
| 62 | 
            -
             | 
| 60 | 
            +
                  if prev_image_id
         | 
| 61 | 
            +
                    if image_id != prev_image_id
         | 
| 62 | 
            +
                      puts "deleting previous image #{prev_image_id}"
         | 
| 63 | 
            +
                      Docker.run "rmi", prev_image_id
         | 
| 64 | 
            +
                    else
         | 
| 65 | 
            +
                      puts "image is identical to cached version"
         | 
| 66 | 
            +
                    end
         | 
| 67 | 
            +
                  elsif image_id
         | 
| 68 | 
            +
                    puts "created new image #{image_id}"
         | 
| 63 69 | 
             
                  else
         | 
| 64 | 
            -
                    puts "image  | 
| 70 | 
            +
                    puts "no image exists for image... what went wrong?"
         | 
| 65 71 | 
             
                  end
         | 
| 66 72 | 
             
                end
         | 
| 67 73 |  | 
| @@ -295,7 +301,7 @@ module Nutkins | |
| 295 301 | 
             
                  img_cfg_path = File.join directory, IMG_CONFIG_FILE_NAME
         | 
| 296 302 | 
             
                  img_cfg = File.exists?(img_cfg_path) ? YAML.load_file(img_cfg_path) : {}
         | 
| 297 303 | 
             
                  img_cfg['image'] ||= path if path != '.'
         | 
| 298 | 
            -
                  img_cfg['shell'] ||= 'sh'
         | 
| 304 | 
            +
                  img_cfg['shell'] ||= '/bin/sh'
         | 
| 299 305 | 
             
                  img_cfg['directory'] = directory
         | 
| 300 306 | 
             
                  img_cfg["version"] ||= @config.version if @config.version
         | 
| 301 307 | 
             
                  img_cfg['version'] = img_cfg['version'].to_s
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: nutkins
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.8.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - James Pike
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2016-08- | 
| 11 | 
            +
            date: 2016-08-26 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: bundler
         |