Class: Autoproj::Jenkins::Updater

Inherits:
Object
  • Object
show all
Defined in:
lib/autoproj/jenkins/updater.rb

Overview

Update a jenkins server configuration from an autoproj workspace

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(ws, server, job_prefix: '') ⇒ Updater

Create a new updater context for an autoproj workspace and Jenkins server



33
34
35
36
37
# File 'lib/autoproj/jenkins/updater.rb', line 33

def initialize(ws, server, job_prefix: '')
    @ws = ws
    @server = server
    @job_prefix = job_prefix
end

Instance Attribute Details

#job_prefixString (readonly)

A string that is prefixed to all job names



24
25
26
# File 'lib/autoproj/jenkins/updater.rb', line 24

def job_prefix
  @job_prefix
end

#serverServer (readonly)

The server we have to update



19
20
21
# File 'lib/autoproj/jenkins/updater.rb', line 19

def server
  @server
end

#wsAutoproj::Workspace (readonly)

The autoproj workspace



14
15
16
# File 'lib/autoproj/jenkins/updater.rb', line 14

def ws
  @ws
end

Instance Method Details

#compute_downstream_packages(package, reverse_dependencies) ⇒ Object



120
121
122
123
124
125
126
127
128
129
130
131
132
# File 'lib/autoproj/jenkins/updater.rb', line 120

def compute_downstream_packages(package, reverse_dependencies)
    queue   = [package.name]
    results = Set.new
    while !queue.empty?
        p_name = queue.shift
        if !results.include?(p_name)
            results << p_name
            queue.concat(reverse_dependencies[p_name].to_a)
        end
    end
    results.delete(package.name)
    results
end

#compute_job_to_package_map(package_names, included_package_names) ⇒ Object



134
135
136
137
138
139
140
141
142
143
# File 'lib/autoproj/jenkins/updater.rb', line 134

def compute_job_to_package_map(package_names, included_package_names)
    result = Hash.new
    package_names.each do |pkg_name|
        if included_package_names.include?(pkg_name)
            job_name = job_name_from_package_name(pkg_name)
            result[job_name] = pkg_name
        end
    end
    result
end

#compute_upstream_packages(package) ⇒ Object



111
112
113
114
115
116
117
118
# File 'lib/autoproj/jenkins/updater.rb', line 111

def compute_upstream_packages(package)
    upstream_packages = package.autobuild.dependencies.inject(Set.new) do |all, pkg_name|
        all << pkg_name
        ws.manifest.find_autobuild_package(pkg_name).all_dependencies(all)
    end
    upstream_packages.delete(package.name)
    upstream_packages
end

#create_or_update_buildconf_job(*package_names, gemfile: 'buildconf-Gemfile', autoproj_install_path: nil, seed: nil, dev: false, quiet_period: 5, credentials_id: nil, vcs_credentials: Credentials.new) ⇒ Object

Create or update the buildconf (master) job



81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/autoproj/jenkins/updater.rb', line 81

def create_or_update_buildconf_job(*package_names, gemfile: 'buildconf-Gemfile', autoproj_install_path: nil, seed: nil, dev: false, quiet_period: 5, credentials_id: nil, vcs_credentials: Credentials.new)
    job_name = job_name_from_package_name("buildconf")

    pipeline = render_buildconf_pipeline(
        *package_names,
        gemfile: gemfile,
        autoproj_install_path: autoproj_install_path,
        credentials_id: credentials_id,
        vcs_credentials: vcs_credentials,
        seed: seed,
        dev: dev)
    server.create_or_reset_job(job_name, 'buildconf.xml', pipeline: pipeline, quiet_period: quiet_period)
end

#job_name_from_package_name(package_name) ⇒ String

Returns the job name of a given package



99
100
101
# File 'lib/autoproj/jenkins/updater.rb', line 99

def job_name_from_package_name(package_name)
    "#{job_prefix}#{package_name.gsub('/', '-')}"
end

#package_by_name(package_name) ⇒ Object

Resolve a package by its name



104
105
106
107
108
109
# File 'lib/autoproj/jenkins/updater.rb', line 104

def package_by_name(package_name)
    package = ws.manifest.find_package_definition(package_name)
    if !package
        raise ArgumentError, "no package called #{package_name}"
    end
end

#render_buildconf_pipeline(*package_names, gemfile: 'buildconf-Gemfile', autoproj_install_path: nil, dev: false, credentials_id: nil, vcs_credentials: Credentials.new, seed: nil) ⇒ Object

Update the buildconf pipeline



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/autoproj/jenkins/updater.rb', line 53

def render_buildconf_pipeline(*package_names, gemfile: 'buildconf-Gemfile', autoproj_install_path: nil, dev: false, credentials_id: nil, vcs_credentials: Credentials.new, seed: nil)
    manifest_vcs = ws.manifest.vcs
    if manifest_vcs.local? || manifest_vcs.none?
        raise ArgumentError, "cannot use Jenkins to build an autoproj buildconf that is not on a remotely acessible VCS"
    end

    job_name = job_name_from_package_name("buildconf")
    server.render_pipeline(job_name, 'buildconf.pipeline',
        vcs: manifest_vcs,
        package_names: package_names,
        gemfile: gemfile,
        autoproj_install_path: autoproj_install_path,
        job_prefix: job_prefix,
        credentials_id: credentials_id,
        seed: seed,
        vcs_credentials: vcs_credentials,
        dev: dev)
end

#update(*packages, seed: nil, quiet_period: 5, gemfile: 'buildconf-Gemfile', autoproj_install_path: nil, vcs_credentials: Credentials.new) ⇒ Array<String>

Create jobs and dependencies to handle the given set of packages



149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
# File 'lib/autoproj/jenkins/updater.rb', line 149

def update(*packages, seed: nil, quiet_period: 5, gemfile: 'buildconf-Gemfile', autoproj_install_path: nil, vcs_credentials: Credentials.new)
    reverse_dependencies = ws.manifest.compute_revdeps

    package_names = packages.map(&:name).to_set
    packages.map do |package|
        job_name = job_name_from_package_name(package.name)
        if !Autoproj::Jenkins.vcs_supported?(package.vcs.type)
            raise UnhandledVCS, "the #{package.vcs.type} importer, used by #{package.name}, is not supported by autoproj-jenkins"
        end

        upstream_jobs   = compute_job_to_package_map(compute_upstream_packages(package), package_names)
        downstream_jobs = compute_job_to_package_map(compute_downstream_packages(package, reverse_dependencies), package_names)

        prefix_relative_path =
            if package.autobuild.srcdir == package.autobuild.prefix
                Pathname.new(package.autobuild.srcdir).
                    relative_path_from(Pathname.new(ws.root_dir)).to_s
            else
                "install/#{package.name}"
            end

        pipeline = server.render_pipeline(job_name, 'package.pipeline',
            buildconf_vcs: ws.manifest.vcs,
            vcs: package.vcs,
            seed: seed,
            package_name: package.name,
            package_dir: Pathname.new(package.autobuild.srcdir).relative_path_from(Pathname.new(ws.root_dir)).to_s,
            artifact_glob: "**/*",
            job_name: job_name,
            upstream_jobs: upstream_jobs,
            downstream_jobs: downstream_jobs,
            gemfile: gemfile,
            autoproj_install_path: autoproj_install_path,
            vcs_credentials: vcs_credentials)

        server.create_or_reset_job(
            job_name, 'package.xml',
            pipeline: pipeline,
            quiet_period: quiet_period)

        job_name
    end
end