class QB::Ansible::Modules::Docker::Image

Build a Docker image if needed. Features to deal with version-tagging.

Public Instance Methods

build_segments_for_from_image() click to toggle source

'openresty/openresty:1.11.2.4-xenial'

=>  repository: 'openresty'
    name: 'openresty'
    tag: {
      major: 1,
      minor: 11,
      patch: 2,
      revision: [4],
      prerelease: ['xenial'],
    }
=>  ['openresty--openresty', 1, 11, 2, 4, 'xenial']

which eventually becomes the Docker tag

    <semver>_openresty.openresty.1.11.2.4.xenial.<build_info?>
# File lib/qb/ansible/modules/docker/image.rb, line 92
def build_segments_for_from_image
  return [] unless include_from_image_build
  
  [
    [
      (from_image.repository == 'beiarea' ? nil : from_image.repository),
      from_image.name,
    ].
      compact.
      map { |name| name.gsub( '_', '-' ) }.
      join( '-' ),
    *from_image.tag.version.to_a.flatten,
  ]
end
force?() click to toggle source
# File lib/qb/ansible/modules/docker/image.rb, line 209
def force?
  source_base_version.dev? && repo_dirty?
end
git() click to toggle source
# File lib/qb/ansible/modules/docker/image.rb, line 108
def git
  lazy_var :@git do
    QB::Repo::Git.from_path path
  end
end
image_name() click to toggle source
# File lib/qb/ansible/modules/docker/image.rb, line 186
def image_name
  lazy_var :@image_name do
    name.merge \
      source: nil, # NEED this!
      tag: QB::Docker::Image::Tag.from_s(
        image_version.docker_tag
      )
  end
end
image_version() click to toggle source
# File lib/qb/ansible/modules/docker/image.rb, line 175
def image_version
  lazy_var :@image_version do
    source_version.merge \
      build: [
        *build_segments_for_from_image,
        *source_version.build
      ]
  end
end
main() click to toggle source

Entry point for the module. invoked by {#run!}.

@return [nil | {Symbol => to_json}]

when returning:

-   `nil`: module will successfully exit with no additional changes.

-   `{Symbol => #to_json}`: Hash will be merged over @facts that
    are returned by the module to be set in the Ansible runtime and
    the module will exit successfully.
# File lib/qb/ansible/modules/docker/image.rb, line 228
def main
  logger.info \
    "Starting `_image`...",
    path: path,
    from_image: from_image.to_s,
    build_arg: build_arg,
    fact_name: fact_name
    
  
  QB::Docker::Image.ensure_present! \
    name: image_name,
    pull: !image_version.dev?,
    build: {
      path: path,
      build_arg: {
        from_image: from_image.string,
        image_version: image_version.semver,
        **build_arg.to_options,
      },
    },
    # Don't push dev images
    push: !image_version.dev?,
    force: force?
  
  response[:image] = {
    name: image_name,
    version: image_version,
  }
  
  if fact_name
    response.facts[fact_name] = response[:image]
  end
  
  return nil
end
repo_clean?() click to toggle source
# File lib/qb/ansible/modules/docker/image.rb, line 197
def repo_clean?
  lazy_var :@repo_clean do
    git.clean?
  end
end
repo_dirty?() click to toggle source
# File lib/qb/ansible/modules/docker/image.rb, line 204
def repo_dirty?
  !repo_clean?
end
source_base_version() click to toggle source
# File lib/qb/ansible/modules/docker/image.rb, line 115
def source_base_version
  lazy_var :@source_base_version do
    QB::Package::Version.from_string (path.to_pn / 'VERSION').read
  end
end
source_dev_version() click to toggle source
# File lib/qb/ansible/modules/docker/image.rb, line 122
def source_dev_version
  lazy_var :@source_dev_version do
    source_base_version.build_version \
      branch: git.branch,
      ref: git.head_short,
      dirty: !git.clean?
      # time: now
  end
end
source_non_dev_version() click to toggle source
# File lib/qb/ansible/modules/docker/image.rb, line 144
def source_non_dev_version
  tag = "v#{ source_base_version.semver }"
  
  # We check...
  #
  # 1.  Repo is clean
  unless git.clean?
    raise "Can't build #{ source_base_version.level } version from " \
          "dirty repo"
  end
  
  # 2.  Tag exists
  unless git.tags.include? tag
    raise "Tag #{ tag } not found"
  end
  
  # 3.  Tag points to current commit
  tag_commit = Cmds.
    new( "git rev-list -n 1 %s", chdir: path ).
    out!( tag ).
    chomp
  
  unless tag_commit == git.head
    raise "Repo is not at tag #{ tag } commit #{ tag_commit }"
  end
  
  # Ok, we just use the version in the file!
  source_base_version
end
source_version() click to toggle source
# File lib/qb/ansible/modules/docker/image.rb, line 133
def source_version
  lazy_var :@source_version do
    if source_base_version.dev?
      source_dev_version
    else
      source_non_dev_version
    end
  end
end