blob: 7824429984cc94de4013b1c97873f0c893ed8c79 [file] [log] [blame]
# 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) | sort -uf > 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