e6afa91e09
kage renders every page in headless Chrome, snapshots the final DOM, strips all JavaScript, and localises CSS, images, and fonts so a site can be browsed offline as a plain folder of files. The engine is split into small packages: urlx deterministic URL to local-path mapping and scope rules sanitize remove scripts, on* handlers, and javascript: URLs asset rewrite HTML and CSS references, download assets browser headless Chrome pool over the DevTools protocol robots robots.txt matcher clone the orchestrator: a polite resumable breadth-first crawl The cli package wires a cobra and fang command surface with two commands, clone and serve. Every pure package has table tests; the browser and clone packages add Chrome-driven end-to-end tests that skip when no browser is present or under -short. CI runs gofmt, vet, build, race tests, golangci-lint, govulncheck, and a tidy check on Linux and macOS. A goreleaser config fans one tag out to archives, deb/rpm/apk, a Chromium-bundled GHCR image, and the package managers. A tago docs site builds to Pages and Cloudflare.
104 lines
2.9 KiB
YAML
104 lines
2.9 KiB
YAML
name: ci
|
|
|
|
on:
|
|
push:
|
|
branches: [main]
|
|
pull_request:
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
# Cancel an in-flight run when a branch is pushed again.
|
|
concurrency:
|
|
group: ci-${{ github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
jobs:
|
|
# Build and test on Linux and macOS with the race detector on. gofmt and vet
|
|
# run here too so a formatting slip fails fast on both platforms. The full
|
|
# suite includes Chrome-driven end-to-end tests, so the runners install a
|
|
# browser first; tests that find none skip themselves, so the job still passes
|
|
# if a future runner image drops Chrome.
|
|
test:
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
os: [ubuntu-latest, macos-latest]
|
|
runs-on: ${{ matrix.os }}
|
|
steps:
|
|
- uses: actions/checkout@v5
|
|
- uses: actions/setup-go@v6
|
|
with:
|
|
go-version-file: go.mod
|
|
check-latest: true
|
|
cache: true
|
|
- name: install chromium (linux)
|
|
if: matrix.os == 'ubuntu-latest'
|
|
uses: browser-actions/setup-chrome@v1
|
|
id: chrome
|
|
- name: gofmt
|
|
run: |
|
|
unformatted=$(gofmt -s -l asset browser cli clone cmd robots sanitize urlx)
|
|
if [ -n "$unformatted" ]; then
|
|
echo "These files need gofmt -s -w:"
|
|
echo "$unformatted"
|
|
exit 1
|
|
fi
|
|
- name: go vet
|
|
run: go vet ./...
|
|
- name: build
|
|
run: go build ./...
|
|
- name: test
|
|
env:
|
|
KAGE_CHROME: ${{ steps.chrome.outputs.chrome-path }}
|
|
run: go test -race -count=1 -coverprofile=coverage.out ./...
|
|
- name: coverage summary
|
|
if: matrix.os == 'ubuntu-latest'
|
|
run: go tool cover -func=coverage.out | tail -1
|
|
|
|
# golangci-lint bundles staticcheck, govet, ineffassign, errcheck, unused and
|
|
# more, so it is the main quality gate.
|
|
lint:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v5
|
|
- uses: actions/setup-go@v6
|
|
with:
|
|
go-version-file: go.mod
|
|
check-latest: true
|
|
cache: true
|
|
- uses: golangci/golangci-lint-action@v8
|
|
with:
|
|
version: latest
|
|
|
|
# Scan the module and its dependencies for known vulnerabilities.
|
|
govulncheck:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v5
|
|
- uses: actions/setup-go@v6
|
|
with:
|
|
go-version-file: go.mod
|
|
check-latest: true
|
|
cache: true
|
|
- name: govulncheck
|
|
run: |
|
|
go install golang.org/x/vuln/cmd/govulncheck@latest
|
|
govulncheck ./...
|
|
|
|
# Confirm go.mod and go.sum are tidy: a PR that adds an import without running
|
|
# go mod tidy fails here instead of breaking a later release.
|
|
tidy:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v5
|
|
- uses: actions/setup-go@v6
|
|
with:
|
|
go-version-file: go.mod
|
|
check-latest: true
|
|
cache: true
|
|
- name: go mod tidy is clean
|
|
run: |
|
|
go mod tidy
|
|
git diff --exit-code -- go.mod go.sum
|