Repository navigation
Releases: cplieger/forge-scout
Release list
v3.0.0
Promoted from v3.0.0-dev.22
forge-scout v3 is the project formerly called github-scout, rebuilt to read more than one forge. It puts the open pull requests, open issues, failing CI workflows and finished CI runs of your repositories on GitHub, GitLab, Gitea and Forgejo on one Grafana dashboard, and adds code-scanning alerts on GitHub. Each forge is a connection in one YAML config file, and connections are read side by side. The dashboard has five tabs: Overview, CI runs, Open work, Code scanning and Scout health. This is a major release, so a v2 deployment needs the steps below before it upgrades.
Upgrade checklist
- Pull
ghcr.io/cplieger/forge-scout:v3.0.0ordocker.io/cplieger/forge-scout:v3.0.0. Thegithub-scoutimages get no new releases. (#488) - Copy
config.example.yamlto/config/config.yaml, add one connection for each forge with itsurl,ownersandtoken, and mount the file read-only. Move each old environment variable to its key as the first breaking change below lists. (#426) - Write the old
PR_EXCLUDE_QUERYandISSUE_EXCLUDE_QUERYfilters asexcluderules, such as- author: "renovate[bot]"or- label: renovate. Theexclude_authorsandexclude_labelskeys that the first breaking change names were removed before this release, and the config file now refuses them as unknown keys. (#443) - With a fine-grained GitHub token, add read-only Contents to its permissions. (#437)
- Mount a
/datavolume that the container user owns, so the run state survives a restart. (#426) - Point every Loki query and alert rule at
{container="forge-scout"}, and replace the old rules withForgeScoutScanDegradedandForgeScoutScanStalledfromdocs/monitoring.md. (#426) - Import the new
grafana-dashboard.json, then delete the old "GitHub Scout" dashboard. (#488) - Change any Renovate rule or download URL that names
cplieger/github-scouttocplieger/forge-scout. (#488)
Breaking changes
Scan GitHub, GitLab, Gitea and Forgejo from one config file (#426)
Change the deployment as follows before upgrading.
- The binary is now
/forge-scout, and the example container name isforge-scout. Update any entrypoint, health check or container name that names/github-scoutorgithub-scout. - Settings now come from one YAML file at
/config/config.yaml, mounted read-only, or the path inCONFIG_PATH. Copyconfig.example.yamlto start. - forge-scout no longer reads
GITHUB_OWNER,GITHUB_TOKEN,SCAN_INTERVAL,LOOKBACK_HOURS,EXCLUDE_REPOS,CODE_SCANNING_EXCLUDE_REPOS,CODE_SCANNING_EXCLUDE_FORKS,PR_EXCLUDE_QUERY,ISSUE_EXCLUDE_QUERYorLOG_LEVEL. - Each connection names its
url,ownersandtoken. The token must be exactly one${NAME}reference to an environment variable whose name ends in_TOKENor starts withFORGE_SCOUT_. - The old settings map as follows:
SCAN_INTERVALtoscan_interval,LOOKBACK_HOURStolookback, a Go duration that must be at least 4.2 timesscan_interval,EXCLUDE_REPOStoexclude_repos,CODE_SCANNING_EXCLUDE_REPOStosecurity.skip_repos,CODE_SCANNING_EXCLUDE_FORKStosecurity.skip_forks, andLOG_LEVELtolog_level. - The two search-query settings are replaced by
exclude_authorsandexclude_labels. - Code scanning on private repositories is off unless
security.include_privateistrue. - A container that still sets
GITHUB_OWNERorGITHUB_TOKENwithout a config file stops at start with an error naming the file. - The run state now lives on a
/datavolume. Mount a folder the container user owns, uid 1000 or yourPUIDandPGID. Without it, each restart starts cold. - Every log line carries
forgeandconnection, andrepois the path the forge shows. workflow runis nowci run.conclusionis replaced bystate(passing,failingorneutral), andeventbytrigger(push,pull_request,schedule,manual,otherorunknown).code scanning alertis nowsecurity alert, withsource.scan completeis logged once per connection.code_alertsis nowsecurity_alerts,durationis nowduration_ms,scannedis gone (repos_discoveredandskippedcount the repositories),failed_signalsnamessecurity_alertsinstead ofcode_scanning, and every signal has a<signal>_readfield.- New log lines:
scan stopped,failing workflow,slow workflow,ci day,disabled workflow,top security alert,security tool,runs coverage gapandowner lists no repository. - A finished run's line can repeat after a crash. Count runs by
connection,repo,run_id,stateandupdated_at. - The Loki selector is now
{container="forge-scout"}. Update any query or rule that reads{container="github-scout"}. - The example alert rules are renamed and retuned.
GithubScoutScanDegradedis nowForgeScoutScanDegraded, grouped by connection, with a 100m window.GithubScoutScanStalledis nowForgeScoutScanStalled, which countsscan completeorscan stoppedover 55m. Replace the old rules with the ones indocs/monitoring.md. - The dashboard's UID is now
forge-scout(it wasgithub-scout), with the title Forge Scout and a new tab layout. Import the newgrafana-dashboard.jsonand delete the old "GitHub Scout" dashboard, because importing over it creates a second dashboard.
Rename github-scout to forge-scout (#488)
The project is renamed from github-scout to forge-scout. Change these before upgrading.
- Pull the image as
ghcr.io/cplieger/forge-scoutordocker.io/cplieger/forge-scout, in place ofghcr.io/cplieger/github-scoutanddocker.io/cplieger/github-scout, which get no new releases. - Use the repository URL https://github.com/cplieger/forge-scout, including in any Renovate rule or dashboard download URL that names
cplieger/github-scout. - The dashboard's UID is
forge-scoutand its title is Forge Scout. Import the newgrafana-dashboard.jsonand delete the old "GitHub Scout" dashboard.
Added
- One config file reads GitHub, GitLab, Gitea and Forgejo connections side by side, each with its own owners and token. A signal a forge does not have, such as code scanning on Gitea and Forgejo, shows as not available instead of 0. (#426)
- A new
excludelist leaves out open pull requests and issues that match a rule, set at the top level for every connection or on one connection. A rule can match on kind, author, label, title as a Go regular expression, repository and draft state, and the Overview shows how many items the rules left out. (#443) - forge-scout keeps each connection open between scans and answers an unchanged page from memory after a conditional request, so an unchanged run list costs no request on GitHub. The Scout health tab shows the requests each connection spends per hour, split by read, and how the read cache answered. (#480)
- The dashboard shows only what needs action. Outside Scout health, a tile that reads 0 and an empty table are hidden, and the Overview shows All clear when nothing needs you. The Code scanning tab hides when no connection reads code scanning. (#481)
- The Overview's table of pull requests is now "Pull requests needing attention" and shows why each one is listed. (#483)
Fixed
- With a fine-grained token, one pull request whose checks GitHub refuses no longer hides every open pull request or degrades the scan. That pull request's checks show as not available with this token, and one warning names the remedy, a classic token with
repo. A repository with more than 500 open code-scanning alerts now reads complete, up to 10,000 alerts per repository. (#437) - Every dashboard panel counts open pull requests and issues apart, so a list of pull requests read in part no longer hides the issue counts. An alert with no security severity shows its problem severity, and a GitHub App author such as
renovate[bot]counts as a bot on every route, so an exclude rule on it matches everywhere. (#460) - When a scan stops on the API budget, the dashboard keeps each connection's last complete scan of the past 7 days instead of going blank, and dates older values with As of. (#465)
- Rows that held a single panel no longer collapse, and the tables on the CI runs and Open work tabs are shorter and scroll. (#483)
- forge-scout now builds on the stable forgeapi v1.3.0 release. (#491)
Performance
- On GitHub, an unchanged code-scanning or workflows page is answered from memory after a free conditional request, and the run list request stays the same for a whole UTC day. None of those reads costs a REST request while its answer is unchanged, and every run count still covers exactly
lookback. (#482)
Full changelog: v2.5.0...v3.0.0
Dependencies: 11 changes (github.com/cplieger/atomicfile/v4, github.com/cplieger/envx/v2, github.com/cplieger/envx/yamlenv/v2)
- Added
github.com/cplieger/atomicfile/v4v4.1.0 (Go) - Removed
github.com/cplieger/envx/v2v2.0.7 (Go) - Added
github.com/cplieger/envx/yamlenv/v2v2.0.3 (Go) - Added
github.com/cplieger/forgeapiv1.3.0 (Go) - Added
github.com/cplieger/jsoncap/v2v2.0.3 (Go) - Removed
github.com/cplieger/runesafe/v2v2.1.1 (Go) - Added
github.com/cplieger/runesafe/v3v3.0.0 (Go) - Added
github.com/cplieger/ssrf/v4v4.4.0 (Go) - Added
go.yaml.in/yaml/v3v3.0.5 (Go) - Transitive changes: 2 Go modules
v2.5.0
Promoted from v2.5.0-dev.3
Changed
- Drop unread repo fields and narrow config defaults (#413)
Full changelog: v2.4.2...v2.5.0
v2.4.2
Built from main for dependency and system-package updates
Full changelog: v2.4.1...v2.4.2
Dependencies: 8 changes (github.com/cplieger/envx/v2, github.com/cplieger/health, github.com/cplieger/httpx/v5)
github.com/cplieger/envx/v2v2.0.3 to v2.0.7 (Go)github.com/cplieger/healthv1.8.0 to v1.8.2 (Go)github.com/cplieger/httpx/v5v5.0.3 to v5.0.5 (Go)github.com/cplieger/runesafe/v2v2.1.0 to v2.1.1 (Go)github.com/cplieger/scheduler/v4v4.2.1 to v4.2.3 (Go)github.com/cplieger/slogxv1.6.5 to v1.6.7 (Go)go1.27.1 to 1.27.2 (Go)- Transitive changes: 1 Go module
System packages: 8 changes (github.com/cplieger/envx/v2, github.com/cplieger/health, github.com/cplieger/httpx/v5)
github.com/cplieger/envx/v2v2.0.3 to v2.0.7github.com/cplieger/healthv1.8.0 to v1.8.2github.com/cplieger/httpx/v5v5.0.3 to v5.0.5github.com/cplieger/pathinside/v2v2.0.1 to v2.0.3github.com/cplieger/runesafe/v2v2.1.0 to v2.1.1github.com/cplieger/scheduler/v4v4.2.1 to v4.2.3github.com/cplieger/slogxv1.6.5 to v1.6.7stdlibgo1.27.1 to go1.27.2
v2.4.1
Fixed
- Remove the failures by repository panel (#393)
v2.4.0
Added
- Move to Grafana schema v2, add failures per repo
v2.3.0
Added
- Ship the license text of every bundled component in the image
v2.2.17
Fixed
- Retry GitHub search timeouts instead of degrading the scan
v2.2.16
Dependencies
- Update gcr.io/distroless/static-debian13:nonroot docker digest to e2e927e (#345)
v2.2.15
Fixed
- Update module github.com/cplieger/scheduler/v4 to v4.2.1 (#343)
v2.2.14
Fixed
- Keep the health deadline armed when the configured cadence is absurd
Dependencies
- Update github.com/cplieger/health to v1.8.0