From f9438c9e4126459cf268ce5f4cf70c1a63d6b591 Mon Sep 17 00:00:00 2001 From: Leonid Brujev Date: Wed, 29 Apr 2026 15:05:48 +0100 Subject: [PATCH 01/11] changed ruby to 3.4 --- .rubocop.yml | 5 ++++- .rubocop_todo.yml | 28 ++++------------------------ .ruby-version | 2 +- 3 files changed, 9 insertions(+), 26 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 31e3ba5..4943e15 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -4,6 +4,9 @@ inherit_gem: defra_ruby_style: - default.yml -require: +plugins: - rubocop-rake - rubocop-rspec + +AllCops: + TargetRubyVersion: 3.4 diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index 6ff8538..c0eaa6e 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -1,28 +1,13 @@ # This configuration was generated by # `rubocop --auto-gen-config` -# on 2023-08-14 14:02:05 UTC using RuboCop version 1.56.0. +# on 2026-04-29 14:05:10 UTC using RuboCop version 1.86.1. # The point is for the user to remove these configuration records # one by one as the offenses are removed from the code base. # Note that changes in the inspected code, or installation of new # versions of RuboCop, may require this file to be generated again. -# Offense count: 8 -# Configuration parameters: EnforcedStyle, AllowedGems, Include. -# SupportedStyles: Gemfile, gems.rb, gemspec -# Include: **/*.gemspec, **/Gemfile, **/gems.rb -Gemspec/DevelopmentDependencies: - Exclude: - - 'quke.gemspec' - # Offense count: 1 -# Configuration parameters: Severity, Include. -# Include: **/*.gemspec -Gemspec/RequiredRubyVersion: - Exclude: - - 'quke.gemspec' - -# Offense count: 1 -# Configuration parameters: IgnoreLiteralBranches, IgnoreConstantBranches. +# Configuration parameters: IgnoreLiteralBranches, IgnoreConstantBranches, IgnoreDuplicateElseBranch. Lint/DuplicateBranch: Exclude: - 'lib/quke/driver_registration.rb' @@ -36,7 +21,7 @@ RSpec/ContextWording: - 'spec/quke/driver_configuration_spec.rb' - 'spec/quke/driver_registration_spec.rb' -# Offense count: 18 +# Offense count: 17 # Configuration parameters: CountAsOne. RSpec/ExampleLength: Max: 22 @@ -57,7 +42,7 @@ RSpec/IdenticalEqualityAssertion: RSpec/MessageSpies: EnforcedStyle: receive -# Offense count: 10 +# Offense count: 9 RSpec/MultipleExpectations: Max: 17 @@ -75,8 +60,3 @@ RSpec/NamedSubject: - 'spec/quke/browserstack_status_reporter_spec.rb' - 'spec/quke/configuration_spec.rb' - 'spec/quke/proxy_configuration_spec.rb' - -# Offense count: 1 -# Configuration parameters: AllowedGroups. -RSpec/NestedGroups: - Max: 4 diff --git a/.ruby-version b/.ruby-version index be94e6f..1cf8253 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -3.2.2 +3.4.6 From f51562281e1817716545e012ede7b909df9c092b Mon Sep 17 00:00:00 2001 From: Leonid Brujev Date: Wed, 29 Apr 2026 15:06:31 +0100 Subject: [PATCH 02/11] Update gem dependencies in gemspec and Gemfile --- Gemfile | 3 ++- quke.gemspec | 14 +++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/Gemfile b/Gemfile index 1a7315c..fd1497d 100644 --- a/Gemfile +++ b/Gemfile @@ -13,9 +13,10 @@ group :development, :test do gem "rdoc" gem "rspec" gem "rubocop" + gem "rubocop-factory_bot" gem "rubocop-rake" gem "rubocop-rspec" - gem "simplecov", "~> 0.17.1" + gem "simplecov", "~> 0.22" gem "simplecov-json", require: false gem "webmock" end diff --git a/quke.gemspec b/quke.gemspec index ab87556..74234d3 100644 --- a/quke.gemspec +++ b/quke.gemspec @@ -35,25 +35,25 @@ Gem::Specification.new do |spec| "public gem pushes." end - spec.required_ruby_version = ">= 2.4" + spec.required_ruby_version = ">= 3.4" # We need the cucumber gem to use cucumber, obviously! - spec.add_dependency "cucumber", "~> 3.1" + spec.add_dependency "cucumber", "~> 11.0" # We use capybara to drive whichever browser we are using, and by drive we # mean things like fill_in x, click_on y etc. Capybara makes it much easier to # do this, though if you're willing to go a level lower you can write your own # code to tell selenium how to interact with a web page - spec.add_dependency "capybara", "~> 3.14" + spec.add_dependency "capybara", "~> 3.40" # We bring in rspec-expectations to simplify how to actually test if a page is # correct. For example you can test you are on the right page in a step using # expect(page).to have_text 'Welcome to test nirvana!' - spec.add_dependency "rspec-expectations", "~> 3.8" + spec.add_dependency "rspec-expectations", "~> 3.13" # selenium-webdriver is used to drive browsers like Firefox, Chrome and # Internet Explorer. - spec.add_dependency "selenium-webdriver", "~> 4.1" + spec.add_dependency "selenium-webdriver", "~> 4.43" # Experience has shown that keeping tests dry helps make them more # maintainable over time. One practice that helps is the use of the @@ -63,13 +63,13 @@ Gem::Specification.new do |spec| # different steps. Site_Prism provides a page object framework, and we build # it into the gem so users of Quke don't have to add and setup this dependency # themselves - spec.add_dependency "site_prism", "~> 3.0" + spec.add_dependency "site_prism", "~> 6.0" # Capybara includes a method called save_and_open_page. Without Launchy it # will still save to file a copy of the source html of the page in question # at that time. However simply adding this line into the gemfile means it # will instead open in the default browser instead. - spec.add_dependency "launchy", "~> 2.4" + spec.add_dependency "launchy", "~> 3.1" # Ruby bindings for BrowserStack Local. This gem handles downloading and # installing the right version of the binary for the OS Quke is running on, From 0bc77191b36ae019ce6fbbd47d7e181f790cd5f5 Mon Sep 17 00:00:00 2001 From: Leonid Brujev Date: Wed, 29 Apr 2026 15:08:17 +0100 Subject: [PATCH 03/11] Update SonarCloud config --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f40ae6b..7ec6765 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: steps: # Downloads a copy of the code in your repository before running CI tests - name: Checkout repository - uses: actions/checkout@v2 + uses: actions/checkout@v4 with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of sonarcloud analysis @@ -37,7 +37,7 @@ jobs: sed -i 's/\/home\/runner\/work\/quke\/quke\//\/github\/workspace\//g' coverage/.resultset.json - name: Analyze with SonarCloud - uses: sonarsource/sonarcloud-github-action@master + uses: sonarsource/sonarqube-scan-action@master env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This is provided automatically by GitHub - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} # This needs to be set in your repo; settings -> secrets + SONAR_TOKEN: ${{ secrets.RUBY_SONAR_TOKEN }} # This needs to be set in your repo; settings -> secrets From 8d9e06831f5ecd147911651f4ae9c9b7a5e78f55 Mon Sep 17 00:00:00 2001 From: Leonid Brujev Date: Wed, 29 Apr 2026 15:15:14 +0100 Subject: [PATCH 04/11] configuration adjustments --- lib/features/support/env.rb | 32 +++++++++----------------------- lib/quke/configuration.rb | 6 +++--- lib/quke/driver_configuration.rb | 2 +- lib/quke/driver_registration.rb | 2 +- 4 files changed, 14 insertions(+), 28 deletions(-) diff --git a/lib/features/support/env.rb b/lib/features/support/env.rb index d55261b..7be0d3a 100644 --- a/lib/features/support/env.rb +++ b/lib/features/support/env.rb @@ -15,10 +15,6 @@ driver_reg = Quke::DriverRegistration.new(driver_config, Quke::Quke.config) driver = driver_reg.register(Quke::Quke.config.driver) -# We need bs_local to be declared outside of the AfterConfiguration block below -# so that it's available in the at_exit block. -# Did try simply calling it @bs_local inside the AfterConfiguration but that -# just kept causing Quke to crash immediately (shrug!) bs_local = nil Capybara.default_driver = driver @@ -41,27 +37,21 @@ # which can mess up your project structure. Capybara.save_path = "tmp/" -# There aren't specific hooks we can attach to that only get called once before -# and after all tests have run in Cucumber. Therefore the next best thing is to -# hook into the AfterConfiguration and at_exit blocks. -# -# As its name suggests, this gets called after Cucumber has been configured i.e. -# all the steps above are complete. Fortunately this is before the tests start -# running so its the best place for us to start up the browserstack local -# testing binary (if it's required) -AfterConfiguration do +# BeforeAll / AfterAll run exactly once around the entire test run (Cucumber 8+). +# We use BeforeAll to start the BrowserStack Local binary when local testing is +# enabled, and AfterAll to stop it cleanly inside Cucumber's lifecycle. +BeforeAll do if Quke::Quke.config.browserstack.test_locally? bs_local = BrowserStack::Local.new - - # starts the Local instance with the required arguments via its management - # API bs_local.start(Quke::Quke.config.browserstack.local_testing_args) end end -# This is the very last thing Cucumber calls that we can hook onto. Typically -# used for final cleanup, we make use of it to kill our browserstack local -# testing binary, and update the status of the session in browserstack +AfterAll do + bs_local&.stop +end + +# Update the BrowserStack session status (pass/fail) after all tests complete. at_exit do # Because of the way cucumber works everthing is made global. This also means # any variables we set also need to be made global so they can be accessed @@ -80,8 +70,4 @@ end end # rubocop:enable Style/GlobalVars - if bs_local && Quke::Quke.config.browserstack.test_locally? - # stop the local instance - bs_local.stop - end end diff --git a/lib/quke/configuration.rb b/lib/quke/configuration.rb index 1f84144..2afbee6 100644 --- a/lib/quke/configuration.rb +++ b/lib/quke/configuration.rb @@ -110,7 +110,7 @@ def pause def stop_on_error # This use of Yaml.load to convert a string to a boolean comes from # http://stackoverflow.com/a/21804027/6117745 - YAML.load(@data["stop_on_error"]) + YAML.safe_load(@data["stop_on_error"]) end # Returns the value set for +display_failures+. @@ -267,7 +267,7 @@ def default_data!(data) # rubocop:disable Style/InverseMethods "display_failures" => !(data["display_failures"].to_s.downcase.strip == "false"), # rubocop:enable Style/InverseMethods - "custom" => (data["custom"] || nil) + "custom" => data["custom"] || nil ) end # rubocop:enable Metrics/AbcSize @@ -278,7 +278,7 @@ def load_yml_data if File.exist? self.class.file_location # YAML.load_file returns false if the file exists but is empty. So # added the || {} to ensure we always return a hash from this method - YAML.load_file(self.class.file_location) || {} + YAML.safe_load_file(self.class.file_location) || {} else {} end diff --git a/lib/quke/driver_configuration.rb b/lib/quke/driver_configuration.rb index bd1e429..375bc7b 100644 --- a/lib/quke/driver_configuration.rb +++ b/lib/quke/driver_configuration.rb @@ -97,7 +97,7 @@ def chrome # def firefox options = Selenium::WebDriver::Firefox::Options.new(profile: firefox_profile) - options.headless! if config.headless + options.add_argument("--headless") if config.headless options end diff --git a/lib/quke/driver_registration.rb b/lib/quke/driver_registration.rb index 9c75424..78292dc 100644 --- a/lib/quke/driver_registration.rb +++ b/lib/quke/driver_registration.rb @@ -97,7 +97,7 @@ def browserstack app, browser: :remote, url: @config.browserstack.url, - desired_capabilities: @driver_config.browserstack + capabilities: [@driver_config.browserstack] ) # :simplecov_ignore: end From d6eeb26d8a62513c6682d33cefa10d6fd102d804 Mon Sep 17 00:00:00 2001 From: Leonid Brujev Date: Wed, 29 Apr 2026 15:16:30 +0100 Subject: [PATCH 05/11] Bump version to 0.11.0 --- lib/quke/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/quke/version.rb b/lib/quke/version.rb index c71e5d0..b77fb4c 100644 --- a/lib/quke/version.rb +++ b/lib/quke/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true module Quke # :nodoc: - VERSION = "0.10.0" + VERSION = "0.11.0" end From 1811de32f33876c27d3ed6c9b0aeae22392d57b0 Mon Sep 17 00:00:00 2001 From: Leonid Brujev Date: Thu, 30 Apr 2026 10:26:23 +0100 Subject: [PATCH 06/11] Update CI configuration: upgrade actions/checkout to v6 and sonarqube-scan-action to v7 --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7ec6765..cb73d91 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: steps: # Downloads a copy of the code in your repository before running CI tests - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of sonarcloud analysis @@ -34,10 +34,10 @@ jobs: - name: Run unit tests run: | bundle exec rspec - sed -i 's/\/home\/runner\/work\/quke\/quke\//\/github\/workspace\//g' coverage/.resultset.json + sed -i 's/\/home\/runner\/work\/quke\/quke\//\/github\/workspace\//g' coverage/coverage.json - name: Analyze with SonarCloud - uses: sonarsource/sonarqube-scan-action@master + uses: sonarsource/sonarqube-scan-action@v7 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This is provided automatically by GitHub SONAR_TOKEN: ${{ secrets.RUBY_SONAR_TOKEN }} # This needs to be set in your repo; settings -> secrets From 0732ab9cf7ac1b21e59dcd166d56968d3c5eaeb0 Mon Sep 17 00:00:00 2001 From: Leonid Brujev Date: Fri, 1 May 2026 17:23:12 +0100 Subject: [PATCH 07/11] Update RuboCop configuration and enhance Chrome driver options - Updated RuboCop configuration timestamp and added exclusion for Metrics/AbcSize. - Enhanced Chrome driver options with window size and disabled back-forward cache features. --- .rubocop_todo.yml | 8 +++++++- lib/features/support/env.rb | 14 ++++++++++++++ lib/quke/driver_configuration.rb | 3 +++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index c0eaa6e..f200707 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -1,6 +1,6 @@ # This configuration was generated by # `rubocop --auto-gen-config` -# on 2026-04-29 14:05:10 UTC using RuboCop version 1.86.1. +# on 2026-05-01 16:22:43 UTC using RuboCop version 1.86.1. # The point is for the user to remove these configuration records # one by one as the offenses are removed from the code base. # Note that changes in the inspected code, or installation of new @@ -12,6 +12,12 @@ Lint/DuplicateBranch: Exclude: - 'lib/quke/driver_registration.rb' +# Offense count: 1 +# Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes, Max. +Metrics/AbcSize: + Exclude: + - 'lib/quke/driver_configuration.rb' + # Offense count: 16 # Configuration parameters: Prefixes, AllowedPatterns. # Prefixes: when, with, without diff --git a/lib/features/support/env.rb b/lib/features/support/env.rb index 7be0d3a..3b04d48 100644 --- a/lib/features/support/env.rb +++ b/lib/features/support/env.rb @@ -20,6 +20,20 @@ Capybara.default_driver = driver Capybara.javascript_driver = driver +# Chrome 147+ raises UnknownError with "Node with given id does not belong to +# the document" instead of StaleElementReferenceError when a cached DOM node +# reference becomes invalid after navigation. Adding UnknownError to Capybara's +# retriable errors makes Chrome behave like Firefox, which retries internally. +if Quke::Quke.config.driver == "chrome" + module QukeChromeStaleNodeFix + def invalid_element_errors + @invalid_element_errors ||= + super + [::Selenium::WebDriver::Error::UnknownError] + end + end + Capybara::Selenium::Driver.prepend(QukeChromeStaleNodeFix) +end + # default_max_wait_time is the maximum time Capybara will wait for an element # to appear. You may wish to override it if you are having to deal with a slow # or unresponsive web site. diff --git a/lib/quke/driver_configuration.rb b/lib/quke/driver_configuration.rb index 375bc7b..05c0d67 100644 --- a/lib/quke/driver_configuration.rb +++ b/lib/quke/driver_configuration.rb @@ -58,6 +58,9 @@ def chrome options = Selenium::WebDriver::Options.chrome(args: args) + options.add_argument("--window-size=1920,1080") + options.add_argument("--disable-back-forward-cache") + options.add_argument("--disable-features=BackForwardCache,BuiltInJsonViewer") options.add_argument("--proxy-server=#{config.proxy.host}:#{config.proxy.port}") if config.proxy.use_proxy? options.add_argument("--proxy-bypass-list=#{no_proxy}") unless config.proxy.no_proxy.empty? From 52fbd7df6191676303aa52f7390424f6947ed67e Mon Sep 17 00:00:00 2001 From: Leonid Brujev Date: Fri, 1 May 2026 17:34:40 +0100 Subject: [PATCH 08/11] Update driver configuration specs to use include matcher for Chrome and Firefox options --- spec/quke/driver_configuration_spec.rb | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/spec/quke/driver_configuration_spec.rb b/spec/quke/driver_configuration_spec.rb index e6f3558..df7edf0 100644 --- a/spec/quke/driver_configuration_spec.rb +++ b/spec/quke/driver_configuration_spec.rb @@ -10,7 +10,7 @@ it "returns an instance of Chrome::Options where the proxy details are NOT set" do Quke::Configuration.file_location = data_path(".no_file.yml") config = Quke::Configuration.new - expect(described_class.new(config).chrome.args).to eq([]) + expect(described_class.new(config).chrome.args).not_to include(start_with("--proxy-server")) end end @@ -18,10 +18,8 @@ it "returns an instance of Chrome::Options containing basic proxy settings" do Quke::Configuration.file_location = data_path(".proxy_basic.yml") config = Quke::Configuration.new - expect(described_class.new(config).chrome.args).to eq( - [ - "--proxy-server=#{config.proxy.host}:#{config.proxy.port}" - ] + expect(described_class.new(config).chrome.args).to include( + "--proxy-server=#{config.proxy.host}:#{config.proxy.port}" ) end end @@ -30,11 +28,9 @@ it "returns an instance of Chrome::Options containing proxy settings including no-proxy details" do Quke::Configuration.file_location = data_path(".proxy.yml") config = Quke::Configuration.new - expect(described_class.new(config).chrome.args).to eq( - [ - "--proxy-server=#{config.proxy.host}:#{config.proxy.port}", - "--proxy-bypass-list=127.0.0.1;192.168.0.1" - ] + expect(described_class.new(config).chrome.args).to include( + "--proxy-server=#{config.proxy.host}:#{config.proxy.port}", + "--proxy-bypass-list=127.0.0.1;192.168.0.1" ) end end @@ -43,11 +39,7 @@ it "returns an instance of Chrome::Options containing the specified user-agent" do Quke::Configuration.file_location = data_path(".user_agent.yml") config = Quke::Configuration.new - expect(described_class.new(config).chrome.args).to eq( - [ - "--user-agent=#{config.user_agent}" - ] - ) + expect(described_class.new(config).chrome.args).to include("--user-agent=#{config.user_agent}") end end @@ -55,7 +47,7 @@ it "returns an instance of Chrome::Options set to run the browser in headless mode" do Quke::Configuration.file_location = data_path(".headless.yml") config = Quke::Configuration.new - expect(described_class.new(config).chrome.args).to eq(["--headless=new"]) + expect(described_class.new(config).chrome.args).to include("--headless=new") end end @@ -129,7 +121,7 @@ it "returns an instance of Firefox::Options set to run the browser in headless mode" do Quke::Configuration.file_location = data_path(".headless.yml") config = Quke::Configuration.new - expect(described_class.new(config).chrome.args).to eq(["--headless=new"]) + expect(described_class.new(config).firefox.args).to include("--headless") end end From 3c027f92cf9f9738d4de865c34054ef6761fe16f Mon Sep 17 00:00:00 2001 From: Leonid Brujev Date: Fri, 1 May 2026 17:42:29 +0100 Subject: [PATCH 09/11] remove redundant step in ci config --- .github/workflows/ci.yml | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cb73d91..5a84af0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,19 +25,8 @@ jobs: - name: Run lint check run: | bundle exec rubocop --format progress --format json --out rubocop-result.json - - # This includes an extra run step. The sonarcloud analysis will be run in a docker container with the current - # folder mounted as `/github/workspace`. The problem is when the .resultset.json file is generated it will - # reference the code in the current folder. So to enable sonarcloud to matchup code coverage with the files we use - # sed to update the references in .resultset.json - # https://community.sonarsource.com/t/code-coverage-doesnt-work-with-github-action/16747/6 - - name: Run unit tests - run: | - bundle exec rspec - sed -i 's/\/home\/runner\/work\/quke\/quke\//\/github\/workspace\//g' coverage/coverage.json - - name: Analyze with SonarCloud uses: sonarsource/sonarqube-scan-action@v7 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This is provided automatically by GitHub - SONAR_TOKEN: ${{ secrets.RUBY_SONAR_TOKEN }} # This needs to be set in your repo; settings -> secrets + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} # This needs to be set in your repo; settings -> secrets From e1425c43db63f469ed98a055cb723782ede1840a Mon Sep 17 00:00:00 2001 From: Leonid Brujev Date: Fri, 1 May 2026 17:46:40 +0100 Subject: [PATCH 10/11] Add unit tests step to CI workflow --- .github/workflows/ci.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5a84af0..5193b8f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,6 +25,11 @@ jobs: - name: Run lint check run: | bundle exec rubocop --format progress --format json --out rubocop-result.json + + - name: Run unit tests + run: | + bundle exec rspec + - name: Analyze with SonarCloud uses: sonarsource/sonarqube-scan-action@v7 env: From 4ed57d5e085b93a99cc7ec5feb92352b77bf8b2b Mon Sep 17 00:00:00 2001 From: Leonid Brujev Date: Fri, 1 May 2026 17:48:24 +0100 Subject: [PATCH 11/11] Update SonarCloud token reference in CI configuration --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5193b8f..10e396d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -34,4 +34,4 @@ jobs: uses: sonarsource/sonarqube-scan-action@v7 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This is provided automatically by GitHub - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} # This needs to be set in your repo; settings -> secrets + SONAR_TOKEN: ${{ secrets.RUBY_SONAR_TOKEN }} # This needs to be set in your repo; settings -> secrets