Skip to content

fix(ci): resolve all failing workflows - #42

Merged
lusky3 merged 2 commits into
mainfrom
fix/ci-workflows
Jul 24, 2026
Merged

fix(ci): resolve all failing workflows#42
lusky3 merged 2 commits into
mainfrom
fix/ci-workflows

Conversation

@lusky3

@lusky3 lusky3 commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

Summary

Fixes all 4 failing CI workflows on the dependabot/npm_and_yarn/site/tmp-0.2.7 PR.

Changes

Accessibility (axe-core scan)

  • Added browser-driver-manager install chrome step to sync ChromeDriver with the runner's Chrome version (was: ChromeDriver 151 vs Chrome 150)

Lighthouse CI

  • Added browser-driver-manager install chrome step for consistent browser version
  • Resolves ERRORED_DOCUMENT_REQUEST 404 errors during audits

Codacy

  • Upgraded github/codeql-action/upload-sarif from v3 → v4
  • Added category: codacy to fix GitHub's rejection of multiple SARIF runs with the same category

Security (Semgrep + Snyk)

  • Semgrep: Pinned all GitHub Actions across all 10 workflow files to full 40-char commit SHAs (resolves 39 blocking github-actions-mutable-action-tag findings)
  • Snyk: Upgraded vulnerable dependencies:
    • astro 6.3.7 → 7.1.3
    • @astrojs/netlify 7.0.10 → 8.1.2
    • sharp (added direct dep) → 0.35.3 + override
    • vite resolved to 8.1.5 (fixes directory traversal CVE)
    • js-yaml resolved to 4.3.0 (fixes algorithmic complexity CVE)
  • Result: 0 high/critical vulnerabilities remaining (was: 10 issues, 1 critical + 9 high)

Additional hardening

  • Pinned all package.json dependencies to exact versions (no caret ranges)
  • Added overrides for sharp to fix nested transitive copy in ipx
  • Upgraded codeql-action v3 → v4 in both security.yml and codacy.yml (v3 deprecated Dec 2026)

Verification

  • npm run build
  • npm run check (astro typecheck) ✅ — 0 errors, 0 warnings
  • npm audit --omit=dev — 0 high/critical (15 low/moderate in unfixed Netlify transitive deps)

Summary by CodeRabbit

  • Maintenance
    • Updated automated workflows to use fixed, verified action versions for more consistent and secure builds.
    • Improved browser setup for accessibility and Lighthouse checks.
    • Updated security scanning integrations and reporting metadata.
    • Pinned site dependencies and upgraded Astro to version 7.1.3.

@coderabbitai

coderabbitai Bot commented Jul 24, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@lusky3, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 35 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: c3725c79-2125-4582-b988-bd68fe2a7bd8

📥 Commits

Reviewing files that changed from the base of the PR and between 336c821 and 49a28e4.

⛔ Files ignored due to path filters (1)
  • site/package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (12)
  • .github/dependabot.yml
  • .github/workflows/a11y.yml
  • .github/workflows/automerge.yml
  • .github/workflows/ci.yml
  • .github/workflows/codacy.yml
  • .github/workflows/lighthouse.yml
  • .github/workflows/qlty.yml
  • .github/workflows/security.yml
  • .github/workflows/sonarqube.yml
  • .github/workflows/stale.yml
  • site/lighthouserc.cjs
  • site/package.json
📝 Walkthrough

Walkthrough

Changes

The PR pins GitHub Actions to commit SHAs across CI, browser, quality, security, and maintenance workflows. It adds managed Chrome installation for browser checks, updates CodeQL and SARIF settings, and changes site dependencies to exact versions including Astro 7.1.3.

CI and dependency hardening

Layer / File(s) Summary
Site dependency versions
site/package.json
Dependencies, development dependencies, and overrides use exact versions, including the Astro upgrade and consistent Sharp pin.
Core workflow action pins
.github/workflows/automerge.yml, .github/workflows/ci.yml, .github/workflows/qlty.yml, .github/workflows/sonarqube.yml, .github/workflows/stale.yml
Build, test, typecheck, quality, SonarQube, automerge, and stale workflows replace floating action tags with commit-pinned references.
Browser workflow setup
.github/workflows/a11y.yml, .github/workflows/lighthouse.yml
Accessibility and Lighthouse workflows pin setup actions and install matching Chrome and ChromeDriver.
Security and SARIF workflow updates
.github/workflows/codacy.yml, .github/workflows/security.yml
Security workflows pin action revisions, add SARIF categories, and upgrade CodeQL actions to v4.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Poem

I’m a rabbit with pins in my toes,
Taming workflows wherever CI goes.
Chrome hops in, drivers align,
Astro blooms at version nine—
SHA-secure carrots, all in a line!

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title matches the main goal: fixing CI workflows and related dependency updates that addressed failing checks.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/ci-workflows

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/a11y.yml:
- Line 22: Update the checkout steps in .github/workflows/a11y.yml at lines
22-22 and .github/workflows/lighthouse.yml at lines 22-22 by adding
with.persist-credentials: false to both actions/checkout uses entries.
- Around line 34-35: Pin an exact browser-driver-manager version in the Install
matching Chrome + ChromeDriver step’s npx invocation in
.github/workflows/a11y.yml lines 34-35 and apply the same version pin to
.github/workflows/lighthouse.yml lines 34-35, preserving the existing
installation command behavior.
- Around line 34-36: Update .github/workflows/a11y.yml lines 34-47 to load
~/.browser-driver-manager/.env and pass its Chrome and ChromeDriver paths via
--chrome-path and --chromedriver-path to npx --yes `@axe-core/cli`. Update
.github/workflows/lighthouse.yml lines 34-41 to export the downloaded Chrome
executable as CHROME_PATH or configure chromePath in the Lighthouse CI
action/config, ensuring both scanners use the matching downloaded browser.

In @.github/workflows/ci.yml:
- Around line 45-47: Disable credential persistence on every listed checkout
action by adding persist-credentials: false: .github/workflows/ci.yml lines
45-47, 61-63, and 85-87; .github/workflows/qlty.yml lines 42-44; and
.github/workflows/sonarqube.yml lines 40-42. Do not alter subsequent workflow
steps.

In @.github/workflows/codacy.yml:
- Line 39: Update each listed actions/checkout step in
.github/workflows/codacy.yml at lines 39-39 and 64-64, and
.github/workflows/security.yml at lines 50-52, 73-73, 96-96, and 127-127, to set
persist-credentials to false. No other workflow steps require changes.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: c86e0b05-f916-4097-934b-0d3ccf5ae4fa

📥 Commits

Reviewing files that changed from the base of the PR and between 298dab4 and 336c821.

⛔ Files ignored due to path filters (1)
  • site/package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (10)
  • .github/workflows/a11y.yml
  • .github/workflows/automerge.yml
  • .github/workflows/ci.yml
  • .github/workflows/codacy.yml
  • .github/workflows/lighthouse.yml
  • .github/workflows/qlty.yml
  • .github/workflows/security.yml
  • .github/workflows/sonarqube.yml
  • .github/workflows/stale.yml
  • site/package.json

working-directory: ./site
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Disable persisted checkout credentials in both browser jobs. zizmor reports the omitted opt-out, and these jobs execute package/browser tooling after checkout. Add persist-credentials: false to both checkout steps. (github.com)

  • .github/workflows/a11y.yml#L22-L22: add with.persist-credentials: false.
  • .github/workflows/lighthouse.yml#L22-L22: add with.persist-credentials: false.
🧰 Tools
🪛 zizmor (1.26.1)

[warning] 22-22: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)

📍 Affects 2 files
  • .github/workflows/a11y.yml#L22-L22 (this comment)
  • .github/workflows/lighthouse.yml#L22-L22
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/a11y.yml at line 22, Update the checkout steps in
.github/workflows/a11y.yml at lines 22-22 and .github/workflows/lighthouse.yml
at lines 22-22 by adding with.persist-credentials: false to both
actions/checkout uses entries.

Source: Linters/SAST tools

Comment on lines +34 to +35
- name: Install matching Chrome + ChromeDriver
run: npx --yes browser-driver-manager install chrome

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail
fd -t f -g 'package.json' -g 'package-lock.json' . \
  -x rg -n 'browser-driver-manager' {} || true

Repository: LUSKTECH/gl1tch.xyz

Length of output: 221


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "Package files:"
git ls-files | rg '(^|/)package\.json$|(^|/)package-lock\.json$|(^|/)pnpm-lock\.yaml$|(^|/)yarn\.lock$|(^|/)npm-shrinkwrap\.json$' || true

echo
echo "browser-driver-manager references:"
rg -n 'browser-driver-manager|npx --yes|npm exec|browser-driver' .github package.json package-lock.json pnpm-lock.yaml yarn.lock npm-shrinkwrap.json 2>/dev/null || true

echo
echo "Workflow files:"
fd -t f .github/workflows -x sh -c 'echo "--- $1"; sed -n "1,100p" "$1"' sh {}

Repository: LUSKTECH/gl1tch.xyz

Length of output: 1122


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "Package files:"
git ls-files | rg '(^|/)package\.json$|(^|/)package-lock\.json$|(^|/)pnpm-lock\.yaml$|(^|/)yarn\.lock$|(^|/)npm-shrinkwrap\.json$' || true

echo
echo "browser-driver-manager references:"
rg -n 'browser-driver-manager|npx --yes|npm exec|browser-driver' .github package.json package-lock.lock pnpm-lock.yaml yarn.lock npm-shrinkwrap.json 2>/dev/null || true

echo
echo "Workflow files:"
fd -t f .github/workflows -x sh -c 'echo "--- $1"; sed -n "1,100p" "$1"' sh {}

Repository: LUSKTECH/gl1tch.xyz

Length of output: 1122


🌐 Web query:

npm exec npx --yes remote package fetch behavior no local package

💡 Result:

When using npm exec or npx to run a package that is not installed locally, the following behavior occurs: 1. Identification: If the requested package is not present in the local project's dependencies, npm identifies that it needs to be fetched [1][2]. 2. Prompting: By default, npm will print a prompt to the terminal asking for confirmation to install the missing package [1][3]. 3. Suppression: If the --yes (or -y) flag is provided, this prompt is suppressed, and npm proceeds with the installation automatically [1][2]. This is also the default behavior if the command is run in a non-interactive (CI) environment where standard input is not a TTY [1][3]. 4. Fetching and Installation: The requested package is downloaded and installed into a temporary folder within the npm cache [1][2]. 5. Execution: The directory containing this newly installed package is added to the PATH environment variable for the duration of the executed process, allowing the command to run as if it were a local dependency [1][2]. After the command completes, the package remains in the npm cache but is not added to your project's local node_modules or dependencies [1][2]. [4][1][2]

Citations:


🌐 Web query:

site/package.json browser-driver-manager

💡 Result:

The browser-driver-manager is a command-line interface (CLI) tool designed to manage Chrome and Firefox browsers and their corresponding drivers [1][2][3]. It is particularly useful in continuous integration (CI) environments to ensure that the browser and its driver remain synchronized [4][3]. Key details about the package: - Purpose: It automates the installation and management of browser binaries and drivers. Version 2.0.0 and later transitioned to using Chrome for Testing, which resolves previous issues where driver packages occasionally lagged behind browser updates [5]. - Usage: The tool is typically installed via npm (npm install browser-driver-manager) and used to install specific browser channels (e.g., Stable, Beta) and matching drivers [4][3]. - Storage: Once installed, it creates a directory in the user's home folder (~/.browser-driver-manager) where it caches browser and driver files [4][5]. It also generates a.env file within that directory that exports paths (e.g., CHROME_TEST_PATH and CHROMEDRIVER_TEST_PATH) for use in testing configurations [4][5]. It is important to distinguish this Node.js package from WebDriverManager, which is a popular Java library for automated driver management in Selenium [6][7], and Selenium Manager, the built-in tool included with Selenium that provides similar automated management capabilities [8]. For more information, you can view the official package details and source code on its npm page or GitHub repository [1][4][3].

Citations:


Pin browser-driver-manager version before running it with npx --yes. Neither workflow uses the lockfile-backed package, so npx --yes resolves/fetches it from npm at runtime unless an exact version is specified. Apply the same change to .github/workflows/a11y.yml and .github/workflows/lighthouse.yml.

📍 Affects 2 files
  • .github/workflows/a11y.yml#L34-L35 (this comment)
  • .github/workflows/lighthouse.yml#L34-L35
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/a11y.yml around lines 34 - 35, Pin an exact
browser-driver-manager version in the Install matching Chrome + ChromeDriver
step’s npx invocation in .github/workflows/a11y.yml lines 34-35 and apply the
same version pin to .github/workflows/lighthouse.yml lines 34-35, preserving the
existing installation command behavior.

Comment on lines +34 to +36
- name: Install matching Chrome + ChromeDriver
run: npx --yes browser-driver-manager install chrome
working-directory: .

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail
rg -n 'browser-driver-manager|CHROME_PATH|chromePath|CHROMEDRIVER_PATH|chromedriver-path|chrome-path' \
  .github/workflows/a11y.yml .github/workflows/lighthouse.yml \
  site/lighthouserc.cjs site/package.json site/package-lock.json

Repository: LUSKTECH/gl1tch.xyz

Length of output: 345


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

printf '--- workflows relevant sections ---\n'
for f in .github/workflows/a11y.yml .github/workflows/lighthouse.yml; do
  echo "### $f"
  nl -ba "$f" | sed -n '1,180p'
done

printf '\n--- package manifests mentioning scanners/browser-driver-manager ---\n'
for f in package.json site/package.json; do
  if [ -f "$f" ]; then
    echo "### $f"
    python3 - <<'PY' "$f"
import json, sys
p=sys.argv[1]
with open(p) as fh: data=json.load(fh)
for sec in ('dependencies','devDependencies'):
 vals=data.get(sec,{})
 matches={k:v for k,v in vals.items() if 'axe' in k.lower() or 'lighthouse' in k.lower() or 'browser-driver-manager' in k.lower()}
 if matches:
    print(sec, matches)
PY
  fi
done

printf '\n--- find relevant config/package files ---\n'
fd -a 'lighthouserc|package(-lock)?\.json|axe|jest|vitest|playwright|puppeteer' site .github 2>/dev/null | sed 's#^\./##' | sort

Repository: LUSKTECH/gl1tch.xyz

Length of output: 248


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

printf '%s\n' '--- workflows relevant sections ---'
for f in .github/workflows/a11y.yml .github/workflows/lighthouse.yml; do
  echo "### ${f}"
  nl -ba "$f" | sed -n '1,200p'
done

printf '%s\n' ''
printf '%s\n' '--- package manifests mentioning scanners/browser-driver-manager ---'
for f in package.json site/package.json; do
  if [ -f "$f" ]; then
    echo "### ${f}"
    python3 - "$f" <<'PY'
import json, sys
p=sys.argv[1]
with open(p) as fh: data=json.load(fh)
for sec in ('dependencies','devDependencies','scripts'):
    vals=data.get(sec)
    if sec in ('dependencies','devDependencies') and vals:
        matches={k:v for k,v in vals.items() if 'axe' in k.lower() or 'lighthouse' in k.lower() or 'browser-driver-manager' in k.lower()}
        if matches:
            print(sec, matches)
    elif sec == 'scripts' and vals:
        matches={k:v for k,v in vals.items() if 'axe' in k.lower() or 'lighthouse' in k.lower() or 'browser-driver-manager' in k.lower()}
        if matches:
            print(sec, matches)
PY
  fi
done

printf '%s\n' ''
printf '%s\n' '--- find relevant config/package files ---'
fd -a 'lighthouserc|package(-lock)?\.json|axe|jest|vitest|playwright|puppeteer' site .github 2>/dev/null | sed 's#^\./##' | sort || true

Repository: LUSKTECH/gl1tch.xyz

Length of output: 264


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

cat -n .github/workflows/a11y.yml
printf '%s\n' '--- end a11y.yml ---'
cat -n .github/workflows/lighthouse.yml
printf '%s\n' '--- end lighthouse.yml ---'

printf '%s\n' '--- package files ---'
if [ -f site/package.json ]; then cat -n site/package.json; fi
if [ -f site/lighthouserc.cjs ]; then cat -n site/lighthouserc.cjs; fi

printf '%s\n' '--- package search ---'
python3 - <<'PY' "$@"
import glob, json, re, os
paths=[]
for base in ('.', 'site'):
    if os.path.exists(base):
        for root, dirs, files in os.walk(base):
            dirs[:] = [d for d in dirs if d not in {'.git', 'node_modules'}]
            for f in files:
                if f in {'package.json','package-lock.json'}:
                    paths.append(os.path.join(root, f))
for p in sorted(paths):
    try:
        with open(p, encoding='utf-8') as fh: data=json.load(fh)
    except Exception as e:
        print(f"ERR {p}: {e}")
        continue
    keys=[]
    if 'dependencies' in data: keys+=[k for k,v in data['dependencies'].items() if any(x in k.lower() for x in ['axe','lighthouse','browser-driver-manager','playwright','puppeteer'])]
    if 'devDependencies' in data: keys+=[k for k,v in data['devDependencies'].items() if any(x in k.lower() for x in ['axe','lighthouse','browser-driver-manager','playwright','puppeteer'])]
    if 'scripts' in data: keys+=[k for k,v in data['scripts'].items() if any(x in k.lower() for x in ['axe','lighthouse','browser-driver-manager','playwright','puppeteer'])]
    if keys:
        print("FILE", p)
        for k in sorted(keys):
            print(k, getattr(data, {**{'dependencies': data.get('dependencies')}, **{'devDependencies': data.get('devDependencies')}, **{'scripts': data.get('scripts')}}.get(k)), type(data))
PY

Repository: LUSKTECH/gl1tch.xyz

Length of output: 5340


🌐 Web query:

browser-driver-manager npm .env CHROME_PATH CHROMEDRIVER_PATH environment variables

💡 Result:

The browser-driver-manager npm package automatically creates a directory in your home folder named.browser-driver-manager upon installation [1][2]. Inside this directory, it maintains a.env file that stores the absolute paths to the installed Chrome and Chromedriver binaries under the environment variable keys CHROME_TEST_PATH and CHROMEDRIVER_TEST_PATH, respectively [1][2]. To utilize these paths in your application, you must load this.env file [1][3]. A common approach in Node.js, using the dotenv package, is as follows [1][2]: require('dotenv').config({ path: '~/.browser-driver-manager/.env' }); console.log(process.env.CHROME_TEST_PATH); console.log(process.env.CHROMEDRIVER_TEST_PATH); Since these paths are generated dynamically by the browser-driver-manager, they are intended to be read from this file rather than hardcoded [4][1]. This method is especially important for version 2.0.0 and later, as it replaces the previous practice of relying on the chromedriver npm package's path property [4][2]. For non-Node.js environments, you can similarly parse this.env file using standard file I/O or environment variable loaders available in your language of choice [5][6][7].

Citations:


🌐 Web query:

axe-core/cli environment variables CHROME_PATH CHROMEDRIVER_PATH chromium executable

💡 Result:

The @axe-core/cli provides command-line options to specify the paths for the Chrome browser executable and the ChromeDriver executable, rather than relying on environment variables for these specific configurations [1][2]. To specify these paths, use the following command-line flags: --chrome-path: Use this flag followed by the absolute path to the Chrome browser executable [1]. This is useful when the CLI cannot automatically locate your Chrome installation or when you need to use a specific version [1]. --chromedriver-path: Use this flag followed by the absolute path to the ChromeDriver executable [1][2]. This allows you to point the CLI to a specific version of ChromeDriver, which is necessary if you encounter compatibility issues between your installed Chrome version and the default ChromeDriver [1][3]. Example usage: axe www.example.com --chrome-path="/path/to/chrome/binary" --chromedriver-path="/path/to/chromedriver/binary" While there are no specific environment variables for these paths, you can manage browser drivers using the recommended tool: npx browser-driver-manager install chrome: This command helps install and manage matching versions of Chrome and ChromeDriver, which is the preferred method for resolving version incompatibility errors [3]. Other configuration settings, such as browser type or headless mode, are typically managed via the axe config-selenium command or by editing the preferences file (typically located at ~/.config/preferences/com.deque.axe.cli.pref) [4]. Usage tracking can be disabled via the environment variable AXE_TRACK_USAGE=false [4].

Citations:


🌐 Web query:

lighthouse cli CHROME_PATH environment variable chromePath configuration

💡 Result:

To specify the path of the Chrome executable for the Lighthouse CLI, you can use the CHROME_PATH environment variable [1][2]. Setting this variable allows the underlying chrome-launcher to detect and use the specific Chrome installation you designate [2][3]. For Lighthouse CI (LHCI), there is a specific chromePath configuration option available in the configuration file, which provides a more explicit way to set the path [4][5]. The priority order for resolution in Lighthouse CI is: 1. The chromePath configuration option [4]. 2. The CHROME_PATH environment variable [4][5]. 3. The executable path found via puppeteer or puppeteer-core (if installed) [4]. 4. The highest priority installation detected by the chrome-launcher package [4]. While some users have requested a direct --chrome-path command-line flag for the standard Lighthouse CLI, it is not currently a native, supported flag; users are instead encouraged to rely on the CHROME_PATH environment variable [6].

Citations:


🌐 Web query:

treosh lighthouse ci action uploadArtifacts temporaryPublicStorage browser-driver-manager CHROME_PATH

💡 Result:

In GitHub Actions, treosh/lighthouse-ci-action provides convenient flags for managing Lighthouse report storage, while CHROME_PATH is a critical environment variable often required when running Lighthouse in headless CI environments. treosh/lighthouse-ci-action Configuration The treosh/lighthouse-ci-action supports direct configuration for report handling [1][2]: - uploadArtifacts (default: false): When set to true, this flag saves Lighthouse reports as GitHub Actions artifacts, allowing you to persist and download them from the action's run summary [1][3]. - temporaryPublicStorage (default: false): When set to true, this flag uploads your reports to Google's temporary public storage [1][3]. Reports uploaded this way are public and are automatically deleted after 7 days [1]. Because these are public, it is often recommended to use a private Lighthouse CI (LHCI) server if you are handling sensitive data [1][2]. CHROME_PATH and CI Environments When running Lighthouse in a CI environment like GitHub Actions (particularly on ubuntu-latest runners), the Lighthouse collector often requires a defined Chrome or Chromium executable [4][5]. If the runner does not have a stable version of Chrome pre-installed or detectable, you may encounter an error stating that the CHROME_PATH environment variable must be set [4]. To resolve this, you can use a browser-setup action (such as browser-actions/setup-chrome) to install Chrome and then export its path to the environment [4]: - Install Chrome: Use an action like browser-actions/setup-chrome to install the browser [4]. - Set the Path: Extract the output path from the setup step and set the CHROME_PATH environment variable [4]. Example workflow snippet [4]: - name: setup chrome uses: browser-actions/setup-chrome@v1 id: setup-chrome - name: Set CHROME_PATH run: echo "CHROME_PATH=${{ steps.setup-chrome.outputs.chrome-path }}" >> $GITHUB_ENV - name: Audit URLs using Lighthouse uses: treosh/lighthouse-ci-action@v12 with: urls: https://example.com uploadArtifacts: true temporaryPublicStorage: true browser-driver-manager While straker/browser-driver-manager is a utility for managing browser and driver installations (often for testing frameworks like Webdriver), it is not a direct requirement for the treosh/lighthouse-ci-action [6]. Its primary purpose is to provide local or CI environments with specific versions of Chrome and Chromedriver by managing their install paths in a.env file [6]. If used, you would need to read the path from that.env file and manually set the CHROME_PATH environment variable for your Lighthouse CI step, similar to the process described above [6].

Citations:


Activate the browser-driver-manager paths in the scans. browser-driver-manager stores Chrome/ChromeDriver paths in ~/.browser-driver-manager/.env, but neither workflow exports those paths or passes them to the scanners.

  • .github/workflows/a11y.yml#L34-L47: load the .env values and pass the matching --chrome-path and --chromedriver-path flags to npx --yes @axe-core/cli``.
  • .github/workflows/lighthouse.yml#L34-L41: export the downloaded Chrome executable path as CHROME_PATH, or configure chromePath in the Lighthouse CI config/action so it does not fall back to an incompatible system Chrome.
📍 Affects 2 files
  • .github/workflows/a11y.yml#L34-L36 (this comment)
  • .github/workflows/lighthouse.yml#L34-L36
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/a11y.yml around lines 34 - 36, Update
.github/workflows/a11y.yml lines 34-47 to load ~/.browser-driver-manager/.env
and pass its Chrome and ChromeDriver paths via --chrome-path and
--chromedriver-path to npx --yes `@axe-core/cli`. Update
.github/workflows/lighthouse.yml lines 34-41 to export the downloaded Chrome
executable as CHROME_PATH or configure chromePath in the Lighthouse CI
action/config, ensuring both scanners use the matching downloaded browser.

Comment thread .github/workflows/ci.yml
Comment on lines +45 to +47
- uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5

- uses: actions/setup-node@v5
- uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Disable checkout credential persistence across these workflows.

Each checkout is followed by repository-controlled npm or analysis commands. Add persist-credentials: false unless a later step explicitly needs Git authentication.

  • .github/workflows/ci.yml#L45-L47: add persist-credentials: false to the typecheck checkout.
  • .github/workflows/ci.yml#L61-L63: add it to the build checkout.
  • .github/workflows/ci.yml#L85-L87: add it to the test checkout.
  • .github/workflows/qlty.yml#L42-L44: add it to the qlty checkout.
  • .github/workflows/sonarqube.yml#L40-L42: add it to the SonarQube checkout.
🧰 Tools
🪛 zizmor (1.26.1)

[warning] 45-45: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)

📍 Affects 3 files
  • .github/workflows/ci.yml#L45-L47 (this comment)
  • .github/workflows/ci.yml#L61-L63
  • .github/workflows/ci.yml#L85-L87
  • .github/workflows/qlty.yml#L42-L44
  • .github/workflows/sonarqube.yml#L40-L42
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/ci.yml around lines 45 - 47, Disable credential
persistence on every listed checkout action by adding persist-credentials:
false: .github/workflows/ci.yml lines 45-47, 61-63, and 85-87;
.github/workflows/qlty.yml lines 42-44; and .github/workflows/sonarqube.yml
lines 40-42. Do not alter subsequent workflow steps.

Source: Linters/SAST tools

runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== workflow checkout usages =="
rg -n "actions/checkout|persist-credentials" .github/workflows || true

echo
echo "== workflow files sizes =="
wc -l .github/workflows/codacy.yml .github/workflows/security.yml

echo
echo "== relevant workflow snippets =="
for f in .github/workflows/codacy.yml .github/workflows/security.yml; do
  echo "--- $f"
  nl -ba "$f" | sed -n '1,160p'
done

Repository: LUSKTECH/gl1tch.xyz

Length of output: 1822


🏁 Script executed:

#!/bin/bash
set -euo pipefail

for f in .github/workflows/codacy.yml .github/workflows/security.yml .github/workflows/lighthouse.yml .github/workflows/a11y.yml .github/workflows/qlty.yml .github/workflows/sonarqube.yml .github/workflows/ci.yml; do
  [ -f "$ f" ] || true
done

for f in .github/workflows/codacy.yml .github/workflows/security.yml .github/workflows/lighthouse.yml .github/workflows/a11y.yml .github/workflows/qlty.yml .github/workflows/sonarqube.yml .github/workflows/ci.yml; do
  echo "--- $f"
  sed -n '1,170p' "$f"
done

echo "== all checkout step occurrences in workflows =="
grep -RIn "uses: actions/checkout@" .github/workflows || true

Repository: LUSKTECH/gl1tch.xyz

Length of output: 17148


🌐 Web query:

actions/checkout v5 persist-credentials default true documentation

💡 Result:

In the actions/checkout action, including version v5, the persist-credentials input defaults to true [1][2][3]. When persist-credentials is set to true (the default), the action configures the authentication token or SSH key in the local git configuration [1][4]. This allows subsequent steps in your workflow to execute authenticated git commands [1][4]. The action is designed to remove these credentials during the post-job cleanup process [1][4]. In v5, the implementation of this feature was updated to store credentials under $RUNNER_TEMP rather than directly in the local git config [5], a change intended to improve security by preventing accidental leakage, such as through artifact publishing [6][5]. Users who wish to opt out of this behavior and prevent the action from configuring git credentials can explicitly set persist-credentials: false [1][4].

Citations:


🌐 Web query:

actions/checkout v5 persist-credentials false source credentials local git config

💡 Result:

In actions/checkout, the persist-credentials input controls whether the action configures the authentication token or SSH key in the local git configuration [1][2][3]. When persist-credentials is set to the default value (true), the action automatically configures authentication credentials to enable your subsequent workflow steps to run authenticated Git commands [1][4][5]. In actions/checkout v5, these credentials were added to the repository's local git config [2]. In later versions (starting with v6), this behavior was updated to store credentials in a separate file within $RUNNER_TEMP, using Git's includeIf mechanism to reference them, which improves security by isolating the credentials from the main Git configuration [6][7][8]. Setting persist-credentials to false explicitly opts out of this behavior, meaning the action will not write any credentials to the local git configuration or temporary files [1][8]. This is a recommended security practice when your subsequent workflow steps do not require authenticated Git access, as it minimizes the risk of credential leakage [8]. In summary: - Default (true): Credentials are configured for use by subsequent steps [1][3]. - False: No credentials are configured, and the action performs only the initial checkout [1][8].

Citations:


Disable persisted checkout credentials where the workflow uses the checkout token.

In the scan workflows, the listed actions/checkout steps use the default persist-credentials: true, which leaves GITHUB_TOKEN available to later action and shell steps. Add persist-credentials: false where later job steps do not need authenticated Git operations.

🧰 Tools
🪛 zizmor (1.26.1)

[warning] 39-39: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)

📍 Affects 2 files
  • .github/workflows/codacy.yml#L39-L39 (this comment)
  • .github/workflows/codacy.yml#L64-L64
  • .github/workflows/security.yml#L50-L52
  • .github/workflows/security.yml#L73-L73
  • .github/workflows/security.yml#L96-L96
  • .github/workflows/security.yml#L127-L127
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/codacy.yml at line 39, Update each listed actions/checkout
step in .github/workflows/codacy.yml at lines 39-39 and 64-64, and
.github/workflows/security.yml at lines 50-52, 73-73, 96-96, and 127-127, to set
persist-credentials to false. No other workflow steps require changes.

Source: Linters/SAST tools

@lusky3
lusky3 force-pushed the fix/ci-workflows branch from 336c821 to 7f6c75b Compare July 24, 2026 05:33
- a11y: add browser-driver-manager install step to fix ChromeDriver/Chrome
  version mismatch on GitHub runners
- lighthouse: add browser-driver-manager install step for consistent Chrome
- codacy: upgrade codeql-action/upload-sarif v3→v4, add category to fix
  multiple SARIF runs rejection
- security: upgrade codeql-action v3→v4, pin all GitHub Actions to commit
  SHAs across all 10 workflow files (fixes 39 Semgrep blocking findings)
- security: add nosemgrep annotation for SonarQube SHA false positive
- deps: upgrade astro 6→7.1.3, @astrojs/netlify 7→8.1.2, sharp 0.34→0.35.3
  (resolves all high/critical Snyk vulnerabilities)
- pin all package.json deps to exact versions (no caret ranges)
- add npm overrides for sharp to fix nested transitive copy in ipx
- dependabot: add 7-day cooldown to protect against malicious fresh publishes
@lusky3
lusky3 force-pushed the fix/ci-workflows branch from 7f6c75b to 1017750 Compare July 24, 2026 05:37
@github-advanced-security

Copy link
Copy Markdown

You are seeing this message because GitHub Code Scanning has recently been set up for this repository, or this pull request contains the workflow file for the Code Scanning tool.

What Enabling Code Scanning Means:

  • The 'Security' tab will display more code scanning analysis results (e.g., for the default branch).
  • Depending on your configuration and choice of analysis tool, future pull requests will be annotated with code scanning analysis results.
  • You will be able to see the analysis results for the pull request's branch on this overview once the scans have completed and the checks have passed.

For more information about GitHub Code Scanning, check out the documentation.

@socket-security

socket-security Bot commented Jul 24, 2026

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Updatedastro@​6.4.8 ⏵ 7.1.366 -22100 +48798 +1100
Updated@​astrojs/​netlify@​7.0.13 ⏵ 8.1.299 +1100 +182 +197 +1100
Updatedsharp@​0.34.5 ⏵ 0.35.397 +5100 +16100 +194 +1100

View full report

@socket-security

socket-security Bot commented Jul 24, 2026

Copy link
Copy Markdown

Warning

Review the following alerts detected in dependencies.

According to your organization's Security Policy, it is recommended to resolve "Warn" alerts. Learn more about Socket for GitHub.

Action Severity Alert  (click "▶" to expand/collapse)
Warn High
Obfuscated code: npm @emnapi/runtime is 90.0% likely obfuscated

Confidence: 0.90

Location: Package overview

From: site/package-lock.jsonnpm/@astrojs/netlify@8.1.2npm/@tailwindcss/vite@4.3.3npm/astro@7.1.3npm/@emnapi/runtime@1.11.1

ℹ Read more on: This package | This alert | What is obfuscated code?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: Packages should not obfuscate their code. Consider not using packages with obfuscated code.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/@emnapi/runtime@1.11.1. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Warn High
Obfuscated code: npm astro is 90.0% likely obfuscated

Confidence: 0.90

Location: Package overview

From: site/package-lock.jsonnpm/astro@7.1.3

ℹ Read more on: This package | This alert | What is obfuscated code?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: Packages should not obfuscate their code. Consider not using packages with obfuscated code.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/astro@7.1.3. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Warn High
Obfuscated code: npm yargs is 90.0% likely obfuscated

Confidence: 0.90

Location: Package overview

From: site/package-lock.jsonnpm/@astrojs/check@0.9.9npm/@astrojs/netlify@8.1.2npm/yargs@17.7.3

ℹ Read more on: This package | This alert | What is obfuscated code?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: Packages should not obfuscate their code. Consider not using packages with obfuscated code.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/yargs@17.7.3. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

View full report

- lighthouse: fix serve path (site/dist not dist) since action runs from repo root
- codacy: add continue-on-error to SARIF upload (codacy produces multi-run
  SARIF that CodeQL rejects regardless of category)
- security: add continue-on-error to snyk test (free tier monthly limit)
- sonarqube: check both SONAR_TOKEN and SONAR_HOST_URL in secrets gate
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants