Class: Vanagon::Project::DSL

Inherits:
Object
  • Object
show all
Defined in:
lib/vanagon/project/dsl.rb

Instance Method Summary collapse

Constructor Details

#initialize(name, configdir, platform, include_components = []) ⇒ Vanagon::Project::DSL

Constructor for the DSL object

Parameters:

  • name (String)

    name of the project

  • configdir (String)

    location for ‘configs’ directory for this project

  • platform (Vanagon::Platform)

    platform for the project to build against

  • include_components (List) (defaults to: [])

    optional list restricting the loaded components



20
21
22
23
24
25
# File 'lib/vanagon/project/dsl.rb', line 20

def initialize(name, configdir, platform, include_components = [])
  @name = name
  @project = Vanagon::Project.new(@name, platform)
  @include_components = include_components.to_set
  @configdir = configdir
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method_name, *args) ⇒ Object

Project attributes and DSL methods defined below

All purpose getter. This object, which is passed to the project block, won’t have easy access to the attributes of the @project, so we make a getter for each attribute.

We only magically handle get_ methods, any other methods just get the standard method_missing treatment.



53
54
55
56
57
58
59
60
61
62
63
# File 'lib/vanagon/project/dsl.rb', line 53

def method_missing(method_name, *args)
  attribute_match = method_name.to_s.match(/get_(.*)/)
  if attribute_match
    attribute = attribute_match.captures.first
    @project.send(attribute)
  elsif @project.settings.key?(method_name)
    return @project.settings[method_name]
  else
    super
  end
end

Instance Method Details

#_projectVanagon::Project

Accessor for the project.

Returns:



38
39
40
# File 'lib/vanagon/project/dsl.rb', line 38

def _project
  @project
end

#bill_of_materials(target) ⇒ Object

This method will write the project’s bill-of-materials to a designated directory during package creation.

Parameters:

  • target (String)

    a full path to the directory for the bill-of-materials for the project



317
318
319
# File 'lib/vanagon/project/dsl.rb', line 317

def bill_of_materials(target)
  @project.bill_of_materials = Vanagon::Common::Pathname.new(target)
end

#cleanup_during_buildObject

Toggle to apply additional cleanup during the build for space constrained systems



300
301
302
# File 'lib/vanagon/project/dsl.rb', line 300

def cleanup_during_build
  @project.cleanup = true
end

#component(name) ⇒ Object

Adds a component to the project

Parameters:

  • name (String)

    name of component to add. must be present in configdir/components and named $name.rb currently



271
272
273
274
275
276
277
# File 'lib/vanagon/project/dsl.rb', line 271

def component(name)
  VanagonLogger.info "Loading #{name}" if @project.settings[:verbose]
  if @include_components.empty? or @include_components.include?(name)
    component = Vanagon::Component.load_component(name, File.join(@configdir, "components"), @project.settings, @project.platform)
    @project.components << component
  end
end

#conflicts(pkgname, version = nil) ⇒ Object

Indicates that this component conflicts with another package, so both cannot be installed at the same time. Conflicts can be collected and used by the project and package.

Parameters:

  • pkgname (String)

    name of the package which conflicts with this component

  • version (String) (defaults to: nil)

    the version of the package that conflicts with this component



139
140
141
# File 'lib/vanagon/project/dsl.rb', line 139

def conflicts(pkgname, version = nil)
  @project.conflicts << OpenStruct.new(:pkgname => pkgname, :version => version)
end

#description(descr) ⇒ Object

Sets the description of the project. Mainly for use in packaging.

Parameters:

  • descr (String)

    description of the project



85
86
87
# File 'lib/vanagon/project/dsl.rb', line 85

def description(descr)
  @project.description = descr
end

#directory(dir, mode: nil, owner: nil, group: nil) ⇒ Object

Adds a directory to the list of directories provided by the project, to be included in any packages of the project

Parameters:

  • dir (String)

    directory to add to the project

  • mode (String) (defaults to: nil)

    octal mode to apply to the directory

  • owner (String) (defaults to: nil)

    owner of the directory

  • group (String) (defaults to: nil)

    group of the directory



233
234
235
# File 'lib/vanagon/project/dsl.rb', line 233

def directory(dir, mode: nil, owner: nil, group: nil)
  @project.directories << Vanagon::Common::Pathname.new(dir, mode: mode, owner: owner, group: group)
end

#environment(name, value) ⇒ Object

Adds an arbitrary environment variable to the project, which will be passed on to the platform and inherited by any components built on that platform



239
240
241
# File 'lib/vanagon/project/dsl.rb', line 239

def environment(name, value)
  @project.environment[name] = value
end

#extra_file_to_sign(file) ⇒ Object

Set to sign additional files during buildtime. Only implemented for windows. Can be specified more than once

Parameters:



372
373
374
# File 'lib/vanagon/project/dsl.rb', line 372

def extra_file_to_sign(file)
  @project.extra_files_to_sign << file
end

#fetch_artifact(path) ⇒ Object

Set additional artifacts to fetch from the build

Parameters:

  • path (String)

    to artifact to fetch from builder



357
358
359
# File 'lib/vanagon/project/dsl.rb', line 357

def fetch_artifact(path)
  @project.artifacts_to_fetch << path
end

#generate_archives(archive) ⇒ Object

Output os-specific archives containing the binary output

Parameters:

  • archive (Boolean)

    whether or not to output archives



176
177
178
# File 'lib/vanagon/project/dsl.rb', line 176

def generate_archives(archive)
  @project.compiled_archive = archive
end

#generate_packages(pkg) ⇒ Object

Generate os-specific packaging artifacts (rpm, deb, etc)

Parameters:

  • pkg (Boolean)

    whether or not to output packages



169
170
171
# File 'lib/vanagon/project/dsl.rb', line 169

def generate_packages(pkg)
  @project.generate_packages = pkg
end

#generate_source_artifacts(source_artifacts) ⇒ Object

Generate source packages in addition to binary packages. Currently only implemented for rpm/deb packages.

Parameters:

  • source_artifacts (Boolean)

    whether or not to output source packages



162
163
164
# File 'lib/vanagon/project/dsl.rb', line 162

def generate_source_artifacts(source_artifacts)
  @project.source_artifacts = source_artifacts
end

#homepage(page) ⇒ Object

Sets the homepage for the project. Mainly for use in packaging.

Parameters:

  • page (String)

    url of homepage of the project



99
100
101
# File 'lib/vanagon/project/dsl.rb', line 99

def homepage(page)
  @project.homepage = page
end

#identifier(ident) ⇒ Object

Sets the identifier for the project. Mainly for use in OSX packaging.

Parameters:

  • ident (String)

    uses the reverse-domain naming convention



264
265
266
# File 'lib/vanagon/project/dsl.rb', line 264

def identifier(ident)
  @project.identifier = ident
end

#inherit_settings(upstream_project_name, upstream_git_url, upstream_git_branch) ⇒ Object

Inherit the settings hash from an upstream project

Parameters:

  • upstream_project_name (String)

    The vanagon project to load settings from

  • upstream_git_url (String)

    The git URL for the vanagon project to load settings from

  • upstream_git_branch (String)

    The git branch for the vanagon project to load settings from



331
332
333
# File 'lib/vanagon/project/dsl.rb', line 331

def inherit_settings(upstream_project_name, upstream_git_url, upstream_git_branch)
  @project.load_upstream_settings(upstream_project_name, upstream_git_url, upstream_git_branch)
end

#inherit_yaml_settings(yaml_settings_uri, yaml_settings_sha1_uri = nil, metadata_uri: nil) ⇒ Object

Inherit the settings hash for the current project and platform from a yaml file as generated by ‘publish_yaml_settings`

Parameters:

  • yaml_settings_uri (String)

    URI (file://… or http://…) to a file containing a yaml representation of vanagon settings

  • yaml_settings_sha1_uri (String) (defaults to: nil)

    URI (file://… or http://…) to a file the sha1sum for the settings file



340
341
342
343
# File 'lib/vanagon/project/dsl.rb', line 340

def inherit_yaml_settings(yaml_settings_uri, yaml_settings_sha1_uri = nil, metadata_uri: nil)
  @project.load_yaml_settings(yaml_settings_uri, yaml_settings_sha1_uri)
  @project.() if 
end

#license(lic) ⇒ Object

Sets the license for the project. Mainly for use in packaging.

Parameters:

  • lic (String)

    the license the project is released under



257
258
259
# File 'lib/vanagon/project/dsl.rb', line 257

def license(lic)
  @project.license = lic
end

#name(the_name) ⇒ Object

Resets the name of the project. Is useful for dynamically changing the project name.

Parameters:

  • the_name (String)

    name of the project



92
93
94
# File 'lib/vanagon/project/dsl.rb', line 92

def name(the_name)
  @project.name = the_name
end

#no_packaging(var) ⇒ Object

Set to true to skip packaging steps during the vanagon build

Parameters:

  • var (Boolean)

    whether or not execute packaging steps during build



364
365
366
# File 'lib/vanagon/project/dsl.rb', line 364

def no_packaging(var)
  @project.no_packaging = var
end

#noarchObject

Sets the project to be architecture independent, or noarch



287
288
289
# File 'lib/vanagon/project/dsl.rb', line 287

def noarch
  @project.noarch = true
end

#package_override(var) ⇒ Object

Set a package override. Will call the platform-specific implementation This will get set in the spec file, deb rules, etc.

Parameters:

  • var

    the string to be included in the build script



349
350
351
352
# File 'lib/vanagon/project/dsl.rb', line 349

def package_override(var)
  platform = @project.platform
  platform.package_override(self._project, var)
end

#project(name, &block) {|_self| ... } ⇒ Object

Primary way of interacting with the DSL

Parameters:

  • name (String)

    name of the project

  • block (Proc)

    DSL definition of the project to call

Yields:

  • (_self)

Yield Parameters:



31
32
33
# File 'lib/vanagon/project/dsl.rb', line 31

def project(name, &block)
  yield(self)
end

#provides(provide, version = nil) ⇒ Object

Indicates that this component provides a system level package. Provides can be collected and used by the project and package.

Parameters:

  • provide (String)

    a package that is provided with this component

  • version (String) (defaults to: nil)

    the version of the package that is provided with this component



129
130
131
# File 'lib/vanagon/project/dsl.rb', line 129

def provides(provide, version = nil)
  @project.provides << OpenStruct.new(:provide => provide, :version => version)
end

#publish_yaml_settingsObject

This method will write the project’s settings (per-platform) to the output directory as yaml after building



311
312
313
# File 'lib/vanagon/project/dsl.rb', line 311

def publish_yaml_settings
  @project.yaml_settings = true
end

#register_rewrite_rule(protocol, rule) ⇒ Object

Sets up a rewrite rule for component sources for a given protocol

Parameters:

  • protocol (String)

    a supported component source type (Http, Git, …)

  • rule (String, Proc)

    a rule used to rewrite component source urls



295
296
297
# File 'lib/vanagon/project/dsl.rb', line 295

def register_rewrite_rule(protocol, rule)
  Vanagon::Component::Source::Rewrite.register_rewrite_rule(protocol, rule)
end

#release(rel) ⇒ Object

Sets the release for the project. Mainly for use in packaging.

Parameters:

  • rel (String)

    release of the project



153
154
155
# File 'lib/vanagon/project/dsl.rb', line 153

def release(rel)
  @project.release = rel
end

#release_from_gitObject

Sets the release for the project to the number of commits since the last tag. Requires that a git tag be present and reachable from the current commit in that repository.



184
185
186
187
188
189
190
# File 'lib/vanagon/project/dsl.rb', line 184

def release_from_git
  repo_object = Git.open(File.expand_path("..", @configdir))
  last_tag = repo_object.describe('HEAD', { :abbrev => 0 })
  release(repo_object.rev_list("#{last_tag}..HEAD", { :count => true }))
rescue Git::GitExecuteError
  VanagonLogger.error "Directory '#{File.expand_path('..', @configdir)}' cannot be versioned by git. Maybe it hasn't been tagged yet?"
end

#replaces(replacement, version = nil) ⇒ Object

Indicates that this component replaces a system level package. Replaces can be collected and used by the project and package.

Parameters:

  • replacement (String)

    a package that is replaced with this component

  • version (String) (defaults to: nil)

    the version of the package that is replaced



121
122
123
# File 'lib/vanagon/project/dsl.rb', line 121

def replaces(replacement, version = nil)
  @project.replaces << OpenStruct.new(:replacement => replacement, :version => version)
end

#requires(requirement, version = nil) ⇒ Object

Sets the run time requirements for the project. Mainly for use in packaging.

Parameters:

  • req (String)

    of requirements of the project



113
114
115
# File 'lib/vanagon/project/dsl.rb', line 113

def requires(requirement, version = nil)
  @project.requires << OpenStruct.new(:requirement => requirement, :version => version)
end

#respond_to_missing?(method_name, include_private = false) ⇒ Boolean

Returns:

  • (Boolean)


65
66
67
# File 'lib/vanagon/project/dsl.rb', line 65

def respond_to_missing?(method_name, include_private = false)
  method_name.to_s.start_with?('get_') || @project.settings.key?(method_name) || super
end

#retry_count(retry_count) ⇒ Object

Counter for the number of times a project should retry a task



322
323
324
# File 'lib/vanagon/project/dsl.rb', line 322

def retry_count(retry_count)
  @project.retry_count = retry_count
end

#setting(name, value) ⇒ Object

Sets a key value pair on the settings hash of the project

Parameters:

  • name (String)

    name of the setting

  • value (String)

    value of the setting



74
75
76
# File 'lib/vanagon/project/dsl.rb', line 74

def setting(name, value)
  @project.settings[name] = value
end

#settingsObject



78
79
80
# File 'lib/vanagon/project/dsl.rb', line 78

def settings
  @project.settings
end

#signing_command(command) ⇒ Object

The command to run to sign additional files. The command should assume it will have the file path appended to the end of the command, since files end up in a temp directory.

Parameters:

  • the (String)

    command to sign additional files



397
398
399
# File 'lib/vanagon/project/dsl.rb', line 397

def signing_command(command)
  @project.signing_command = command
end

#signing_hostname(hostname) ⇒ Object

The hostname to sign additional files on. Only does anything when there are extra files to sign

Parameters:

  • hostname (String)

    of the machine to run the extra file signing on



380
381
382
# File 'lib/vanagon/project/dsl.rb', line 380

def signing_hostname(hostname)
  @project.signing_hostname = hostname
end

#signing_username(username) ⇒ Object

The username to log in to the signing_hostname as. Only does anything when there are extra files to sign

Parameters:

  • the (String)

    username to log in to ‘signing_hostname` as



388
389
390
# File 'lib/vanagon/project/dsl.rb', line 388

def signing_username(username)
  @project.signing_username = username
end

#target_repo(repo) ⇒ Object

Adds a target repo for the project

Parameters:

  • repo (String)

    name of the target repository to ship to used in laying out the packages on disk



282
283
284
# File 'lib/vanagon/project/dsl.rb', line 282

def target_repo(repo)
  @project.repo = repo
end

#timeout(to) ⇒ Object

Sets the timeout for the project retry logic

Parameters:

  • page (Integer)

    timeout in seconds



106
107
108
# File 'lib/vanagon/project/dsl.rb', line 106

def timeout(to)
  @project.timeout = to
end

#user(name, group: nil, shell: nil, is_system: false, homedir: nil) ⇒ Object

Add a user to the project

Parameters:

  • name (String)

    name of the user to create

  • group (String) (defaults to: nil)

    group of the user

  • shell (String) (defaults to: nil)

    login shell to set for the user

  • is_system (true, false) (defaults to: false)

    if the user should be a system user

  • homedir (String) (defaults to: nil)

    home directory for the user



250
251
252
# File 'lib/vanagon/project/dsl.rb', line 250

def user(name, group: nil, shell: nil, is_system: false, homedir: nil)
  @project.user = Vanagon::Common::User.new(name, group, shell, is_system, homedir)
end

#vendor(vend) ⇒ Object

Sets the vendor for the project. Used in packaging artifacts.

Parameters:

  • vend (String)

    vendor or author of the project



223
224
225
# File 'lib/vanagon/project/dsl.rb', line 223

def vendor(vend)
  @project.vendor = vend
end

#version(ver) ⇒ Object

Sets the version for the project. Mainly for use in packaging.

Parameters:

  • ver (String)

    version of the project



146
147
148
# File 'lib/vanagon/project/dsl.rb', line 146

def version(ver)
  @project.version = ver.tr('-', '.')
end

#version_from_branchObject

Get the version string from a git branch name. This will look for a ‘.’ delimited string of numbers of any length and return that as the version. For example, ‘maint/1.7.0/fixing-some-bugs’ will return ‘1.7.0’ and ‘4.8.x’ will return ‘4.8’.

Returns:

  • version string parsed from branch name, fails if unable to find version



209
210
211
212
213
214
215
216
217
218
# File 'lib/vanagon/project/dsl.rb', line 209

def version_from_branch
  branch = Git.open(File.expand_path("..", @configdir)).current_branch
  if branch =~ /(\d+(\.\d+)+)/
    return $1
  else
    fail "Can't find a version in your branch, make sure it matches <number>.<number>, like maint/1.7.0/fixing-some-bugs"
  end
rescue Git::GitExecuteError => e
  fail "Something went wrong trying to find your git branch.\n#{e}"
end

#version_from_gitObject

Sets the version for the project based on a git describe of the directory that holds the configs. Requires that a git tag be present and reachable from the current commit in that repository.



196
197
198
199
200
201
# File 'lib/vanagon/project/dsl.rb', line 196

def version_from_git
  git_version = Git.open(File.expand_path("..", @configdir)).describe('HEAD', tags: true)
  version(git_version.split('-').reject(&:empty?).join('.'))
rescue Git::GitExecuteError
  VanagonLogger.error "Directory '#{File.expand_path('..', @configdir)}' cannot be versioned by git. Maybe it hasn't been tagged yet?"
end

#write_version_file(target) ⇒ Object

This method will write the project’s version to a designated file during package creation

Parameters:

  • target (String)

    a full path to the version file for the project



306
307
308
# File 'lib/vanagon/project/dsl.rb', line 306

def write_version_file(target)
  @project.version_file = Vanagon::Common::Pathname.file(target)
end