-
-
Notifications
You must be signed in to change notification settings - Fork 8.7k
Expand file tree
/
Copy pathRakefile
More file actions
299 lines (254 loc) · 9.61 KB
/
Rakefile
File metadata and controls
299 lines (254 loc) · 9.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
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
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
# frozen_string_literal: true
require 'English'
$LOAD_PATH.unshift File.expand_path('.')
require 'base64'
require 'json'
require 'rake'
require 'rbconfig'
require 'net/http'
require 'net/telnet'
require 'stringio'
require 'fileutils'
require 'open-uri'
require 'git'
require 'find'
Rake.application.instance_variable_set(:@name, 'go')
orig_verbose = verbose
verbose(false)
require 'rake_tasks/bazel'
require 'rake_tasks/common'
$DEBUG = orig_verbose != Rake::FileUtilsExt::DEFAULT ||
ENV['debug'] == 'true' ||
ENV.fetch('DEBUG', nil) ||
ENV.fetch('SE_DEBUG', nil)
verbose($DEBUG)
SeleniumRake.git = Git.open(__dir__)
# Load language-specific rake files within namespaces
namespace(:java) { load 'rake_tasks/java.rake' }
namespace(:rb) { load 'rake_tasks/ruby.rake' }
namespace(:ruby) { load 'rake_tasks/ruby.rake' }
namespace(:py) { load 'rake_tasks/python.rake' }
namespace(:python) { load 'rake_tasks/python.rake' } # alias
namespace(:node) { load 'rake_tasks/node.rake' }
namespace(:js) { load 'rake_tasks/node.rake' } # alias
namespace(:javascript) { load 'rake_tasks/node.rake' } # alias
namespace(:dotnet) { load 'rake_tasks/dotnet.rake' }
namespace(:rust) { load 'rake_tasks/rust.rake' }
namespace(:bazel) { load 'rake_tasks/bazel.rake' }
namespace(:appium) { load 'rake_tasks/appium.rake' }
# If it looks like a bazel target, build it with bazel
rule(%r{//.*}) do |task|
Bazel.execute('build', %w[], task.name)
end
task default: [:grid]
task grid: [:'java:grid']
# ./go update_browser stable
# ./go update_browser beta
desc 'Update pinned browser versions'
task :update_browsers, [:channel] do |_task, arguments|
chrome_channel = arguments[:channel] || 'Stable'
chrome_channel = 'beta' if chrome_channel == 'early-stable'
args = ['--', "--chrome_channel=#{chrome_channel.capitalize}"]
puts 'pinning updated browsers and drivers'
Bazel.execute('run', args, '//scripts:pinned_browsers')
end
desc 'Update Selenium Manager to latest release'
task :update_manager do |_task, _arguments|
puts 'Updating Selenium Manager references'
Bazel.execute('run', [], '//scripts:selenium_manager')
end
desc 'Update multitool binaries to latest releases'
task :update_multitool do |_task, _arguments|
puts 'Updating multitool binary versions'
Bazel.execute('run', [], '//scripts:update_multitool_binaries')
end
desc 'Update dependencies for release'
task :release_update do |_task, _arguments|
Rake::Task[:update_multitool].invoke
end
desc 'Update Chrome DevTools support'
task :update_cdp, [:channel] do |_task, arguments|
chrome_channel = arguments[:channel] || 'stable'
chrome_channel = 'beta' if chrome_channel == 'early-stable'
args = ['--', "--chrome_channel=#{chrome_channel.capitalize}"]
puts "Updating Chrome DevTools references to include latest from #{chrome_channel} channel"
Bazel.execute('run', args, '//scripts:update_cdp')
end
task ios_driver: 'appium:build'
desc 'Update AUTHORS file'
task :authors do
puts 'Updating AUTHORS file'
sh "(git log --use-mailmap --format='%aN <%aE>' ; " \
'cat .OLD_AUTHORS ; cat AUTHORS) | ' \
'sort -uf > AUTHORS.tmp && mv AUTHORS.tmp AUTHORS'
end
# Example: `./go release_updates selenium-4.31.0 early-stable`
# Example: `./go release_updates selenium-4.31.1-ruby`
desc 'Update everything in preparation for a release'
task :release_updates, [:tag, :channel] do |_task, arguments|
parsed = SeleniumRake.parse_tag(arguments[:tag])
version = parsed[:version]
language = parsed[:language]
if parsed[:patch].zero?
Rake::Task['update_browsers'].invoke(arguments[:channel])
Rake::Task['update_cdp'].invoke(arguments[:channel])
Rake::Task['update_manager'].invoke
Rake::Task['update_multitool'].invoke
Rake::Task['authors'].invoke
Rake::Task['rust:version'].invoke(version)
Rake::Task['rust:update'].invoke
Rake::Task['rust:changelogs'].invoke
end
Rake::Task["#{language}:version"].invoke(version)
Rake::Task["#{language}:update"].invoke
Rake::Task["#{language}:changelogs"].invoke
end
desc 'Format code (auto-fix issues across project, skip with -<lang>)'
task :format do |_task, arguments|
args = arguments.to_a
puts 'Formatting Bazel files...'
Bazel.execute('run', [], '//:buildifier')
puts 'Updating copyright headers...'
Bazel.execute('run', [], '//scripts:update_copyright')
unless args.delete('-rust')
puts 'Formatting rust...'
Rake::Task['rust:format'].invoke
end
Rake::Task['all:format'].invoke(*args)
end
desc 'Run linters (may auto-fix some issues; stricter checks than :format)'
task :lint do
puts 'Linting shell scripts and GitHub Actions...'
shellcheck = Bazel.execute('build', [], '@multitool//tools/shellcheck')
Bazel.execute('run', ['--', '-shellcheck', shellcheck], '@multitool//tools/actionlint:cwd')
Rake::Task['all:lint'].invoke
end
# Legacy aliases - call namespaced tasks
task 'selenium-server-standalone' => 'java:grid'
task 'selenium-java' => 'java:client'
task javadocs: 'java:docs'
task 'java-release-zip': 'java:package'
task 'maven-install': 'java:install'
task 'publish-maven' => 'java:release'
task 'publish-maven-snapshot' do
Rake::Task['java:release'].invoke('nightly')
end
task 'release-java' => 'java:release'
LANG_ALIASES = {
'python' => 'py', 'ruby' => 'rb', 'javascript' => 'node', 'js' => 'node'
}.freeze
namespace :all do
desc 'Pin dependencies for all language bindings'
task :pin do
Rake::Task['java:pin'].invoke
Rake::Task['rb:pin'].invoke
Rake::Task['node:pin'].invoke
Rake::Task['dotnet:pin'].invoke
end
desc 'Update dependencies for all language bindings'
task :update do
Rake::Task['java:update'].invoke
Rake::Task['rb:update'].invoke
Rake::Task['node:update'].invoke
Rake::Task['dotnet:update'].invoke
end
desc 'Build all API Documentation'
task :docs do |_task, arguments|
args = arguments.to_a
Rake::Task['java:docs'].invoke(*args)
Rake::Task['py:docs'].invoke(*args)
Rake::Task['rb:docs'].invoke(*args)
Rake::Task['dotnet:docs'].invoke(*args)
Rake::Task['node:docs'].invoke(*args)
end
desc 'Build all artifacts for all language bindings'
task :build do |_task, arguments|
Rake::Task['java:build'].invoke(*arguments.to_a)
Rake::Task['py:build'].invoke(*arguments.to_a)
Rake::Task['rb:build'].invoke(*arguments.to_a)
Rake::Task['dotnet:build'].invoke(*arguments.to_a)
Rake::Task['node:build'].invoke(*arguments.to_a)
end
desc 'Package or build stamped artifacts for distribution in GitHub Release assets'
task :package do |_task, arguments|
Rake::Task['java:package'].invoke(*arguments.to_a)
Rake::Task['dotnet:package'].invoke(*arguments.to_a)
end
desc 'Validate release credentials for all languages'
task :check_credentials do |_task, arguments|
args = arguments.to_a
failures = []
%w[java py rb dotnet node].each do |lang|
Rake::Task["#{lang}:check_credentials"].invoke(*args)
rescue StandardError => e
failures << "#{lang}: #{e.message}"
end
raise "Credential check failed:\n#{failures.join("\n")}" unless failures.empty?
end
desc 'Verify all packages are published to their registries'
task :verify do
failures = []
%w[java py rb dotnet node].each do |lang|
Rake::Task["#{lang}:verify"].invoke
rescue StandardError => e
failures << "#{lang}: #{e.message}"
end
raise "Verification failed:\n#{failures.join("\n")}" unless failures.empty?
end
desc 'Release all artifacts for all language bindings'
task :release do |_task, arguments|
args = arguments.to_a.include?('nightly') ? ['nightly'] : []
Rake::Task['java:release'].invoke(*args)
Rake::Task['py:release'].invoke(*args)
Rake::Task['rb:release'].invoke(*args)
Rake::Task['dotnet:release'].invoke(*args)
Rake::Task['node:release'].invoke(*args)
end
desc 'Format code for all language bindings (skip with -java -py -rb -dotnet -node)'
task :format do |_task, arguments|
all_langs = %w[java py rb dotnet node]
skip = arguments.to_a.map { |a| LANG_ALIASES.fetch(a.delete_prefix('-'), a.delete_prefix('-')) }
(all_langs - skip).each do |lang|
puts "Formatting #{lang}..."
Rake::Task["#{lang}:format"].invoke
end
end
desc 'Run linters for all language bindings'
task :lint do
all_langs = %w[java py rb dotnet node]
failures = []
all_langs.each do |lang|
puts "Linting #{lang}..."
Rake::Task["#{lang}:lint"].invoke
rescue StandardError => e
failures << "#{lang}: #{e.message}"
end
raise "Lint failed:\n#{failures.join("\n")}" unless failures.empty?
end
desc 'Update versions for all language bindings'
task :version, [:version] do |_task, arguments|
version = arguments[:version] || 'nightly'
puts "Updating all versions to #{version}"
Rake::Task['java:version'].invoke(version)
Rake::Task['rb:version'].invoke(version)
Rake::Task['node:version'].invoke(version)
Rake::Task['py:version'].invoke(version)
Rake::Task['dotnet:version'].invoke(version)
unless version == 'nightly'
major_minor = arguments[:version][/^\d+\.\d+/]
file = '.github/ISSUE_TEMPLATE/bug-report.yml'
old_version_pattern = /The latest released version of Selenium is (\d+\.\d+)/
text = File.read(file).gsub(old_version_pattern, "The latest released version of Selenium is #{major_minor}")
File.write(file, text)
end
end
desc 'Update changelogs for all language bindings'
task :changelogs do |_task, _arguments|
puts 'Updating all changelogs'
Rake::Task['java:changelogs'].invoke
Rake::Task['rb:changelogs'].invoke
Rake::Task['node:changelogs'].invoke
Rake::Task['py:changelogs'].invoke
Rake::Task['dotnet:changelogs'].invoke
end
end