autoproj-jenkins 0.1.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 +7 -0
- data/.gitignore +10 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +41 -0
- data/Rakefile +11 -0
- data/autoproj-jenkins.gemspec +28 -0
- data/lib/autoproj/cli/jenkins.rb +100 -0
- data/lib/autoproj/cli/main_jenkins.rb +123 -0
- data/lib/autoproj/cli/test_postprocessing.rb +85 -0
- data/lib/autoproj/jenkins/credentials.rb +67 -0
- data/lib/autoproj/jenkins/exceptions.rb +7 -0
- data/lib/autoproj/jenkins/relativize.rb +74 -0
- data/lib/autoproj/jenkins/render_template.rb +92 -0
- data/lib/autoproj/jenkins/server.rb +79 -0
- data/lib/autoproj/jenkins/templates/abort-if-upstream-failed.pipeline.erb +18 -0
- data/lib/autoproj/jenkins/templates/bootstrap.pipeline.erb +27 -0
- data/lib/autoproj/jenkins/templates/buildconf-Gemfile +3 -0
- data/lib/autoproj/jenkins/templates/buildconf-config.yml.erb +12 -0
- data/lib/autoproj/jenkins/templates/buildconf-vagrant-Gemfile +4 -0
- data/lib/autoproj/jenkins/templates/buildconf.pipeline.erb +43 -0
- data/lib/autoproj/jenkins/templates/buildconf.xml.erb +24 -0
- data/lib/autoproj/jenkins/templates/handle-downstream.pipeline.erb +20 -0
- data/lib/autoproj/jenkins/templates/import-archive.pipeline.erb +2 -0
- data/lib/autoproj/jenkins/templates/import-git.pipeline.erb +16 -0
- data/lib/autoproj/jenkins/templates/import-svn.pipeline.erb +13 -0
- data/lib/autoproj/jenkins/templates/jenkins_dependency_overrides.rb.erb +5 -0
- data/lib/autoproj/jenkins/templates/package-Gemfile +2 -0
- data/lib/autoproj/jenkins/templates/package.pipeline.erb +102 -0
- data/lib/autoproj/jenkins/templates/package.xml.erb +23 -0
- data/lib/autoproj/jenkins/templates/setup-git-credentials.pipeline.erb +8 -0
- data/lib/autoproj/jenkins/templates/wait-upstream.pipeline.erb +160 -0
- data/lib/autoproj/jenkins/test_format_converters/boost-test.xsl +347 -0
- data/lib/autoproj/jenkins/updater.rb +214 -0
- data/lib/autoproj/jenkins/version.rb +5 -0
- data/lib/autoproj/jenkins.rb +19 -0
- data/lib/autoproj-jenkins.rb +8 -0
- metadata +179 -0
@@ -0,0 +1,214 @@
|
|
1
|
+
module Autoproj::Jenkins
|
2
|
+
# Returns true if the given VCS type is supported
|
3
|
+
#
|
4
|
+
# @param [#to_s] vcs the VCS type (e.g. 'git')
|
5
|
+
def self.vcs_supported?(vcs)
|
6
|
+
Autoproj::Jenkins.has_template?("import-#{vcs}.pipeline")
|
7
|
+
end
|
8
|
+
|
9
|
+
# Update a jenkins server configuration from an autoproj workspace
|
10
|
+
class Updater
|
11
|
+
# The autoproj workspace
|
12
|
+
#
|
13
|
+
# @return [Autoproj::Workspace]
|
14
|
+
attr_reader :ws
|
15
|
+
|
16
|
+
# The server we have to update
|
17
|
+
#
|
18
|
+
# @return [Server]
|
19
|
+
attr_reader :server
|
20
|
+
|
21
|
+
# A string that is prefixed to all job names
|
22
|
+
#
|
23
|
+
# @return [String]
|
24
|
+
attr_reader :job_prefix
|
25
|
+
|
26
|
+
# Create a new updater context for an autoproj workspace and Jenkins
|
27
|
+
# server
|
28
|
+
#
|
29
|
+
# @param [Autoproj::Workspace] ws
|
30
|
+
# @param [Server] server
|
31
|
+
# @param [String] job_prefix a string that should be prefixed to all job
|
32
|
+
# names
|
33
|
+
def initialize(ws, server, job_prefix: '')
|
34
|
+
@ws = ws
|
35
|
+
@server = server
|
36
|
+
@job_prefix = job_prefix
|
37
|
+
end
|
38
|
+
|
39
|
+
# Create the master buildconf job
|
40
|
+
#
|
41
|
+
# @return [void]
|
42
|
+
def create_buildconf_job(force: false, quiet_period: 5)
|
43
|
+
if force
|
44
|
+
server.delete_job("#{job_prefix}buildconf")
|
45
|
+
end
|
46
|
+
server.create_job("#{job_prefix}buildconf", 'buildconf.xml', quiet_period: quiet_period)
|
47
|
+
end
|
48
|
+
|
49
|
+
# Update the buildconf pipeline
|
50
|
+
#
|
51
|
+
# @param [String] jenkins_url the URL of the jenkins server from the
|
52
|
+
# point of view of the job's execution
|
53
|
+
# @param [String] gemfile the gemfile template that should be used for
|
54
|
+
# the autoproj bootstrap. Mostly used for autoproj-jenkins development
|
55
|
+
# within VMs
|
56
|
+
# @param [String] autoproj_install_path a path local to the jenkins
|
57
|
+
# workspace where the autoproj_install script will be. If unset,
|
58
|
+
# downloads it from github.com
|
59
|
+
# @param [Boolean] dev whether the packages pipelines should be updated
|
60
|
+
# with --dev or not
|
61
|
+
# @param [Array<Autoproj::PackageDefinition>] packages if non-empty,
|
62
|
+
# restrict operations to these packages and their dependencies
|
63
|
+
def update_buildconf_pipeline(*package_names, gemfile: 'buildconf-Gemfile', autoproj_install_path: nil, dev: false, credentials_id: nil, vcs_credentials: Credentials.new)
|
64
|
+
manifest_vcs = ws.manifest.vcs
|
65
|
+
if manifest_vcs.local? || manifest_vcs.none?
|
66
|
+
raise ArgumentError, "cannot use Jenkins to build an autoproj buildconf that is not on a remotely acessible VCS"
|
67
|
+
end
|
68
|
+
|
69
|
+
server.update_job_pipeline("#{job_prefix}buildconf", 'buildconf.pipeline',
|
70
|
+
vcs: manifest_vcs,
|
71
|
+
package_names: package_names,
|
72
|
+
gemfile: gemfile,
|
73
|
+
autoproj_install_path: autoproj_install_path,
|
74
|
+
job_prefix: job_prefix,
|
75
|
+
credentials_id: credentials_id,
|
76
|
+
vcs_credentials: vcs_credentials,
|
77
|
+
dev: dev)
|
78
|
+
end
|
79
|
+
|
80
|
+
# Create or update the buildconf (master) job
|
81
|
+
#
|
82
|
+
# @param [Array<Autoproj::PackageDefinition>] packages if non-empty,
|
83
|
+
# restrict operations to these packages and their dependencies
|
84
|
+
# @param [String] gemfile the gemfile template that should be used for
|
85
|
+
# the autoproj bootstrap. Mostly used for autoproj-jenkins development
|
86
|
+
# within VMs
|
87
|
+
# @param [Integer] quiet_period the job's quiet period, in seconds.
|
88
|
+
# Mostly used within autoproj-jenkins tests
|
89
|
+
def create_or_update_buildconf_job(*packages, gemfile: 'buildconf-Gemfile', autoproj_install_path: nil, dev: false, quiet_period: 5, credentials_id: nil, vcs_credentials: Credentials.new)
|
90
|
+
job_name = "#{job_prefix}buildconf"
|
91
|
+
if !server.has_job?(job_name)
|
92
|
+
create_buildconf_job(quiet_period: quiet_period)
|
93
|
+
end
|
94
|
+
update_buildconf_pipeline(
|
95
|
+
*packages,
|
96
|
+
gemfile: gemfile,
|
97
|
+
autoproj_install_path: autoproj_install_path,
|
98
|
+
credentials_id: credentials_id,
|
99
|
+
vcs_credentials: vcs_credentials,
|
100
|
+
dev: dev)
|
101
|
+
end
|
102
|
+
|
103
|
+
# Returns the job name of a given package
|
104
|
+
#
|
105
|
+
# @param [String] package_name
|
106
|
+
# @return [String]
|
107
|
+
def job_name_from_package_name(package_name)
|
108
|
+
"#{job_prefix}#{package_name.gsub('/', '-')}"
|
109
|
+
end
|
110
|
+
|
111
|
+
# Create a job for a package
|
112
|
+
#
|
113
|
+
# @return [void]
|
114
|
+
def create_package_job(package, job_name: job_name_from_package_name(package.name), force: false, quiet_period: 5)
|
115
|
+
job_name = job_name_from_package_name(package.name)
|
116
|
+
if force
|
117
|
+
server.delete_job(job_name)
|
118
|
+
end
|
119
|
+
|
120
|
+
server.create_job(job_name, 'package.xml', quiet_period: quiet_period)
|
121
|
+
end
|
122
|
+
|
123
|
+
# Resolve a package by its name
|
124
|
+
def package_by_name(package_name)
|
125
|
+
package = ws.manifest.find_package_definition(package_name)
|
126
|
+
if !package
|
127
|
+
raise ArgumentError, "no package called #{package_name}"
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
def compute_upstream_packages(package)
|
132
|
+
upstream_packages = package.autobuild.dependencies.inject(Set.new) do |all, pkg_name|
|
133
|
+
all << pkg_name
|
134
|
+
ws.manifest.find_autobuild_package(pkg_name).all_dependencies(all)
|
135
|
+
end
|
136
|
+
upstream_packages.delete(package.name)
|
137
|
+
upstream_packages
|
138
|
+
end
|
139
|
+
|
140
|
+
def compute_downstream_packages(package, reverse_dependencies)
|
141
|
+
queue = [package.name]
|
142
|
+
results = Set.new
|
143
|
+
while !queue.empty?
|
144
|
+
p_name = queue.shift
|
145
|
+
if !results.include?(p_name)
|
146
|
+
results << p_name
|
147
|
+
queue.concat(reverse_dependencies[p_name].to_a)
|
148
|
+
end
|
149
|
+
end
|
150
|
+
results.delete(package.name)
|
151
|
+
results
|
152
|
+
end
|
153
|
+
|
154
|
+
def compute_job_to_package_map(package_names, included_package_names)
|
155
|
+
result = Hash.new
|
156
|
+
package_names.each do |pkg_name|
|
157
|
+
if included_package_names.include?(pkg_name)
|
158
|
+
job_name = job_name_from_package_name(pkg_name)
|
159
|
+
result[job_name] = pkg_name
|
160
|
+
end
|
161
|
+
end
|
162
|
+
result
|
163
|
+
end
|
164
|
+
|
165
|
+
# Create jobs and dependencies to handle the given set of packages
|
166
|
+
#
|
167
|
+
# @return [Array<String>] the list of names of the jobs that have been
|
168
|
+
# created/updated
|
169
|
+
def update(*packages, quiet_period: 5, gemfile: 'buildconf-Gemfile', autoproj_install_path: nil, vcs_credentials: Credentials.new)
|
170
|
+
reverse_dependencies = ws.manifest.compute_revdeps
|
171
|
+
|
172
|
+
packages.each do |package|
|
173
|
+
job_name = job_name_from_package_name(package.name)
|
174
|
+
if !server.has_job?(job_name)
|
175
|
+
create_package_job(package, job_name: job_name, quiet_period: quiet_period)
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
package_names = packages.map(&:name).to_set
|
180
|
+
packages.map do |package|
|
181
|
+
job_name = job_name_from_package_name(package.name)
|
182
|
+
if !Autoproj::Jenkins.vcs_supported?(package.vcs.type)
|
183
|
+
raise UnhandledVCS, "the #{package.vcs.type} importer, used by #{package.name}, is not supported by autoproj-jenkins"
|
184
|
+
end
|
185
|
+
|
186
|
+
upstream_jobs = compute_job_to_package_map(compute_upstream_packages(package), package_names)
|
187
|
+
downstream_jobs = compute_job_to_package_map(compute_downstream_packages(package, reverse_dependencies), package_names)
|
188
|
+
|
189
|
+
prefix_relative_path =
|
190
|
+
if package.autobuild.srcdir == package.autobuild.prefix
|
191
|
+
Pathname.new(package.autobuild.srcdir).
|
192
|
+
relative_path_from(Pathname.new(ws.root_dir)).to_s
|
193
|
+
else
|
194
|
+
"install/#{package.name}"
|
195
|
+
end
|
196
|
+
|
197
|
+
server.update_job_pipeline(job_name, 'package.pipeline',
|
198
|
+
buildconf_vcs: ws.manifest.vcs,
|
199
|
+
vcs: package.vcs,
|
200
|
+
package_name: package.name,
|
201
|
+
package_dir: Pathname.new(package.autobuild.srcdir).relative_path_from(Pathname.new(ws.root_dir)).to_s,
|
202
|
+
artifact_glob: "**/*",
|
203
|
+
job_name: job_name,
|
204
|
+
upstream_jobs: upstream_jobs,
|
205
|
+
downstream_jobs: downstream_jobs,
|
206
|
+
gemfile: gemfile,
|
207
|
+
autoproj_install_path: autoproj_install_path,
|
208
|
+
vcs_credentials: vcs_credentials)
|
209
|
+
|
210
|
+
job_name
|
211
|
+
end
|
212
|
+
end
|
213
|
+
end
|
214
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'find'
|
2
|
+
require 'pathname'
|
3
|
+
require 'set'
|
4
|
+
require 'jenkins_api_client'
|
5
|
+
require "autoproj"
|
6
|
+
require "autoproj/autobuild"
|
7
|
+
require "autoproj/jenkins/version"
|
8
|
+
require "autoproj/jenkins/exceptions"
|
9
|
+
require "autoproj/jenkins/render_template"
|
10
|
+
require "autoproj/jenkins/server"
|
11
|
+
require "autoproj/jenkins/updater"
|
12
|
+
require "autoproj/jenkins/relativize"
|
13
|
+
require "autoproj/jenkins/credentials"
|
14
|
+
|
15
|
+
module Autoproj
|
16
|
+
module Jenkins
|
17
|
+
# Your code goes here...
|
18
|
+
end
|
19
|
+
end
|
metadata
ADDED
@@ -0,0 +1,179 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: autoproj-jenkins
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Sylvain Joyeux
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-09-13 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: jenkins_api_client
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: autoproj
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 2.0.0.rc20
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 2.0.0.rc20
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: bundler
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.12'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.12'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rake
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '11.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '11.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: minitest
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '5.0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '5.0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: simplecov
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: flexmock
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
description:
|
112
|
+
email:
|
113
|
+
- sylvain.joyeux@m4x.org
|
114
|
+
executables: []
|
115
|
+
extensions: []
|
116
|
+
extra_rdoc_files: []
|
117
|
+
files:
|
118
|
+
- ".gitignore"
|
119
|
+
- Gemfile
|
120
|
+
- LICENSE.txt
|
121
|
+
- README.md
|
122
|
+
- Rakefile
|
123
|
+
- autoproj-jenkins.gemspec
|
124
|
+
- lib/autoproj-jenkins.rb
|
125
|
+
- lib/autoproj/cli/jenkins.rb
|
126
|
+
- lib/autoproj/cli/main_jenkins.rb
|
127
|
+
- lib/autoproj/cli/test_postprocessing.rb
|
128
|
+
- lib/autoproj/jenkins.rb
|
129
|
+
- lib/autoproj/jenkins/credentials.rb
|
130
|
+
- lib/autoproj/jenkins/exceptions.rb
|
131
|
+
- lib/autoproj/jenkins/relativize.rb
|
132
|
+
- lib/autoproj/jenkins/render_template.rb
|
133
|
+
- lib/autoproj/jenkins/server.rb
|
134
|
+
- lib/autoproj/jenkins/templates/abort-if-upstream-failed.pipeline.erb
|
135
|
+
- lib/autoproj/jenkins/templates/bootstrap.pipeline.erb
|
136
|
+
- lib/autoproj/jenkins/templates/buildconf-Gemfile
|
137
|
+
- lib/autoproj/jenkins/templates/buildconf-config.yml.erb
|
138
|
+
- lib/autoproj/jenkins/templates/buildconf-vagrant-Gemfile
|
139
|
+
- lib/autoproj/jenkins/templates/buildconf.pipeline.erb
|
140
|
+
- lib/autoproj/jenkins/templates/buildconf.xml.erb
|
141
|
+
- lib/autoproj/jenkins/templates/handle-downstream.pipeline.erb
|
142
|
+
- lib/autoproj/jenkins/templates/import-archive.pipeline.erb
|
143
|
+
- lib/autoproj/jenkins/templates/import-git.pipeline.erb
|
144
|
+
- lib/autoproj/jenkins/templates/import-svn.pipeline.erb
|
145
|
+
- lib/autoproj/jenkins/templates/jenkins_dependency_overrides.rb.erb
|
146
|
+
- lib/autoproj/jenkins/templates/package-Gemfile
|
147
|
+
- lib/autoproj/jenkins/templates/package.pipeline.erb
|
148
|
+
- lib/autoproj/jenkins/templates/package.xml.erb
|
149
|
+
- lib/autoproj/jenkins/templates/setup-git-credentials.pipeline.erb
|
150
|
+
- lib/autoproj/jenkins/templates/wait-upstream.pipeline.erb
|
151
|
+
- lib/autoproj/jenkins/test_format_converters/boost-test.xsl
|
152
|
+
- lib/autoproj/jenkins/updater.rb
|
153
|
+
- lib/autoproj/jenkins/version.rb
|
154
|
+
homepage: https://github.com/doudou/autoproj-jenkins
|
155
|
+
licenses:
|
156
|
+
- MIT
|
157
|
+
metadata: {}
|
158
|
+
post_install_message:
|
159
|
+
rdoc_options: []
|
160
|
+
require_paths:
|
161
|
+
- lib
|
162
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
168
|
+
requirements:
|
169
|
+
- - ">="
|
170
|
+
- !ruby/object:Gem::Version
|
171
|
+
version: '0'
|
172
|
+
requirements: []
|
173
|
+
rubyforge_project:
|
174
|
+
rubygems_version: 2.5.1
|
175
|
+
signing_key:
|
176
|
+
specification_version: 4
|
177
|
+
summary: Exporting an autoproj build to a jenkins server
|
178
|
+
test_files: []
|
179
|
+
has_rdoc:
|