Skip to content

Commit 5d81dcf

Browse files
committed
[build] Split Rakefile into per-language task files
Reorganize the monolithic Rakefile into separate files: - rake_tasks/common.rb - Shared SeleniumRake module - rake_tasks/java.rake - Java binding tasks - rake_tasks/python.rake - Python binding tasks - rake_tasks/ruby.rake - Ruby binding tasks - rake_tasks/node.rake - JavaScript/Node binding tasks - rake_tasks/dotnet.rake - .NET binding tasks - rake_tasks/rust.rake - Selenium Manager tasks - rake_tasks/grid.rake - Grid tasks Each file is loaded into its namespace(s) with aliases: - rb/ruby, py/python, node/js/javascript Also removes remaining dead code: - rake_tasks/selenium_rake/ utilities (browsers, checks, formatters, generators) - rake_tasks/rake/ and rake_tasks/bazel/ extensions - rake_tasks/python.rb - .git-fixfiles - cpp/iedriverserver/build.desc
1 parent 168fdf3 commit 5d81dcf

File tree

9 files changed

+1309
-1227
lines changed

9 files changed

+1309
-1227
lines changed

Rakefile

Lines changed: 134 additions & 1227 deletions
Large diffs are not rendered by default.

rake_tasks/common.rb

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
# frozen_string_literal: true
2+
3+
require 'git'
4+
require 'net/http'
5+
require 'fileutils'
6+
7+
# Shared utilities used by language-specific rake tasks
8+
module SeleniumRake
9+
class << self
10+
attr_accessor :git
11+
end
12+
13+
def self.updated_version(current, desired = nil, nightly = nil)
14+
if !desired.nil? && desired != 'nightly'
15+
# If desired is present, return full 3 digit version
16+
desired.split('.').tap { |v| v << 0 while v.size < 3 }.join('.')
17+
elsif current.split(/\.|-/).size > 3
18+
# if current version is already nightly, just need to bump it; this will be noop for some languages
19+
pattern = /-?\.?(nightly|SNAPSHOT|dev|\d{12})\d*$/
20+
current.gsub(pattern, nightly)
21+
elsif current.split(/\.|-/).size == 3
22+
# if current version is not nightly, need to bump the version and make nightly
23+
"#{current.split(/\.|-/).tap { |i| (i[1] = i[1].to_i + 1) && (i[2] = 0) }.join('.')}#{nightly}"
24+
end
25+
end
26+
27+
def self.previous_tag(current_version, language = nil)
28+
version = current_version.split(/\.|-/)
29+
if version.size > 3
30+
puts 'WARNING - Changelogs not updated when set to prerelease'
31+
elsif version[2].to_i > 1
32+
# specified as patch release
33+
patch_version = (version[2].to_i - 1).to_s
34+
"selenium-#{[[version[0]], version[1], patch_version].join('.')}-#{language}"
35+
elsif version[2] == '1'
36+
# specified as patch release; special case
37+
"selenium-#{[[version[0]], version[1], '0'].join('.')}"
38+
else
39+
minor_version = (version[1].to_i - 1)
40+
tags = git.tags.map(&:name)
41+
tag = language ? tags.reverse.find { |t| t.match?(/selenium-4\.#{minor_version}.*-#{language}/) } : nil
42+
tag || "selenium-#{[[version[0]], minor_version, '0'].join('.')}"
43+
end
44+
end
45+
46+
def self.update_changelog(version, language, path, changelog, header)
47+
tag = previous_tag(version, language)
48+
bullet = language == 'javascript' ? '-' : '*'
49+
skip_patterns = /^(bump|update.*version|Bumping to nightly)/i
50+
tags_to_remove = /\[(dotnet|rb|py|java|js|rust)\]:?\s?/
51+
52+
command = "git log #{tag}...HEAD --pretty=format:'%s' --reverse -- #{path}"
53+
log = `#{command}`
54+
55+
entries = log.lines
56+
.map(&:strip)
57+
.grep(/\(#\d+\)/)
58+
.grep_v(skip_patterns)
59+
.map { |line| line.gsub(tags_to_remove, '') }
60+
.map { |line| "#{bullet} #{line}" }
61+
.join("\n")
62+
63+
content = File.read(changelog)
64+
File.write(changelog, "#{header}\n#{entries}\n\n#{content}")
65+
git.add(changelog)
66+
end
67+
68+
def self.verify_package_published(url)
69+
puts "Verifying #{url}..."
70+
uri = URI(url)
71+
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') { |http| http.request(Net::HTTP::Get.new(uri)) }
72+
raise "Package not published: #{url}" unless res.is_a?(Net::HTTPSuccess)
73+
74+
puts 'Verified!'
75+
end
76+
end

rake_tasks/dotnet.rake

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
# frozen_string_literal: true
2+
3+
def dotnet_version
4+
File.foreach('dotnet/selenium-dotnet-version.bzl') do |line|
5+
return line.split('=').last.strip.tr('"', '') if line.include?('SE_VERSION')
6+
end
7+
end
8+
9+
desc 'Build nupkg files'
10+
task :build do |_task, arguments|
11+
Bazel.execute('build', arguments.to_a, '//dotnet:all')
12+
end
13+
14+
desc 'Package .NET bindings into zipped assets and stage for release'
15+
task :package do |_task, arguments|
16+
args = arguments.to_a.empty? ? ['--stamp'] : arguments.to_a
17+
Rake::Task['dotnet:build'].invoke(*args)
18+
mkdir_p 'build/dist'
19+
FileUtils.rm_f(Dir.glob('build/dist/*dotnet*'))
20+
21+
FileUtils.copy('bazel-bin/dotnet/release.zip', "build/dist/selenium-dotnet-#{dotnet_version}.zip")
22+
FileUtils.chmod(0o666, "build/dist/selenium-dotnet-#{dotnet_version}.zip")
23+
FileUtils.copy('bazel-bin/dotnet/strongnamed.zip', "build/dist/selenium-dotnet-strongnamed-#{dotnet_version}.zip")
24+
FileUtils.chmod(0o666, "build/dist/selenium-dotnet-strongnamed-#{dotnet_version}.zip")
25+
end
26+
27+
desc 'Validate .NET release credentials'
28+
task :check_credentials do |_task, arguments|
29+
nightly = arguments.to_a.include?('nightly')
30+
if nightly && (ENV['GITHUB_TOKEN'].nil? || ENV['GITHUB_TOKEN'].empty?)
31+
raise 'Missing GitHub token: set GITHUB_TOKEN for nightly releases'
32+
elsif !nightly && (ENV['NUGET_API_KEY'].nil? || ENV['NUGET_API_KEY'].empty?)
33+
raise 'Missing NuGet API key: set NUGET_API_KEY'
34+
end
35+
end
36+
37+
desc 'Build, package, and push nupkg files to NuGet'
38+
task :release do |_task, arguments|
39+
nightly = arguments.to_a.include?('nightly')
40+
Rake::Task['dotnet:check_credentials'].invoke(*arguments.to_a)
41+
42+
if nightly
43+
puts 'Updating .NET version to nightly...'
44+
Rake::Task['dotnet:version'].invoke('nightly')
45+
ENV['NUGET_API_KEY'] = ENV.fetch('GITHUB_TOKEN', nil)
46+
ENV['NUGET_SOURCE'] = 'https://nuget.pkg.github.com/seleniumhq/index.json'
47+
else
48+
ENV['NUGET_SOURCE'] = 'https://api.nuget.org/v3/index.json'
49+
end
50+
51+
puts 'Building and packaging .NET artifacts...'
52+
Rake::Task['dotnet:package'].invoke('--config=release')
53+
54+
puts "Pushing .NET packages to #{ENV.fetch('NUGET_SOURCE', nil)}..."
55+
Bazel.execute('run', ['--config=release'], '//dotnet:publish')
56+
end
57+
58+
desc 'Verify .NET packages are published on NuGet'
59+
task :verify do
60+
SeleniumRake.verify_package_published("https://api.nuget.org/v3/registration5-semver1/selenium.webdriver/#{dotnet_version}.json")
61+
SeleniumRake.verify_package_published("https://api.nuget.org/v3/registration5-semver1/selenium.support/#{dotnet_version}.json")
62+
end
63+
64+
desc 'Generate .NET documentation'
65+
task :docs do |_task, arguments|
66+
if dotnet_version.include?('nightly') && !arguments.to_a.include?('force')
67+
abort('Aborting documentation update: nightly versions should not update docs.')
68+
end
69+
70+
puts 'Generating .NET documentation'
71+
FileUtils.rm_rf('build/docs/api/dotnet/')
72+
Bazel.execute('run', [], '//dotnet:docs')
73+
end
74+
75+
desc 'Run .NET formatter (handled by scripts/format.sh)'
76+
task :lint do |_task, _arguments|
77+
puts ' .NET formatting is handled by scripts/format.sh'
78+
end
79+
80+
desc 'Install .NET packages to local NuGet cache'
81+
task :install do
82+
Bazel.execute('build', [], '//dotnet/src/webdriver:webdriver-pack')
83+
Bazel.execute('build', [], '//dotnet/src/support:support-pack')
84+
Dir.glob('bazel-bin/dotnet/src/**/*.nupkg').each do |nupkg|
85+
sh 'dotnet', 'nuget', 'push', nupkg, '--source', "#{Dir.home}/.nuget/packages"
86+
end
87+
end
88+
89+
desc 'Update .NET changelog'
90+
task :changelogs do
91+
header = "v#{dotnet_version}\n======"
92+
SeleniumRake.update_changelog(dotnet_version, 'dotnet', 'dotnet/src/', 'dotnet/CHANGELOG', header)
93+
end
94+
95+
desc 'Update .NET version'
96+
task :version, [:version] do |_task, arguments|
97+
old_version = dotnet_version
98+
nightly = "-nightly#{Time.now.strftime('%Y%m%d%H%M')}"
99+
new_version = SeleniumRake.updated_version(old_version, arguments[:version], nightly)
100+
puts "Updating .NET from #{old_version} to #{new_version}"
101+
102+
file = 'dotnet/selenium-dotnet-version.bzl'
103+
text = File.read(file).gsub(old_version, new_version)
104+
File.open(file, 'w') { |f| f.puts text }
105+
SeleniumRake.git.add(file)
106+
end
107+
108+
desc 'Update .NET dependencies to latest versions'
109+
task :update do
110+
Bazel.execute('run', [], '//dotnet:paket-update')
111+
Rake::Task['dotnet:pin'].invoke
112+
end
113+
114+
desc 'Pin .NET dependencies (sync lockfile)'
115+
task :pin do
116+
Bazel.execute('run', [], '//dotnet:paket-install')
117+
Bazel.execute('run', ['--', '--dependencies-file', "#{Dir.pwd}/dotnet/paket.dependencies",
118+
'--output-folder', "#{Dir.pwd}/dotnet"],
119+
'@rules_dotnet//tools/paket2bazel:paket2bazel')
120+
%w[dotnet/paket.lock dotnet/paket.nuget.bzl].each { |f| SeleniumRake.git.add(f) }
121+
end

rake_tasks/grid.rake

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# frozen_string_literal: true
2+
3+
desc 'Build Grid Server'
4+
task :build do |_task, arguments|
5+
Bazel.execute('build', arguments.to_a, '//java/src/org/openqa/selenium/grid:executable-grid')
6+
end
7+
8+
desc 'Package Grid server into releasable artifacts'
9+
task :package do |_task, arguments|
10+
args = arguments.to_a.empty? ? ['--config=release'] : arguments.to_a
11+
Bazel.execute('build', args, '//java/src/org/openqa/selenium/grid:server-zip')
12+
Bazel.execute('build', args, '//java/src/org/openqa/selenium/grid:executable-grid')
13+
14+
mkdir_p 'build/dist'
15+
Dir.glob('build/dist/*server*').each { |file| FileUtils.rm_f(file) }
16+
17+
FileUtils.copy('bazel-bin/java/src/org/openqa/selenium/grid/server-zip.zip',
18+
"build/dist/selenium-server-#{java_version}.zip")
19+
FileUtils.chmod(0o666, "build/dist/selenium-server-#{java_version}.zip")
20+
FileUtils.copy('bazel-bin/java/src/org/openqa/selenium/grid/selenium',
21+
"build/dist/selenium-server-#{java_version}.jar")
22+
FileUtils.chmod(0o777, "build/dist/selenium-server-#{java_version}.jar")
23+
end
24+
25+
desc 'Package Grid for nightly release'
26+
task :release do |_task, _arguments|
27+
# Grid doesn't publish to a registry, just packages artifacts for GitHub release
28+
Rake::Task['grid:package'].invoke('--config=release')
29+
end

0 commit comments

Comments
 (0)