05a87960d1
A second goreleaser build links a Windows binary for the GUI subsystem (-H windowsgui) and ships it as kage_<version>_windows-gui_<arch>.zip, scoped so the package managers still install the console build. Packing a viewer onto this base gives a double-click .exe with no console behind it. A CI job cross-compiles the windowsgui link so it cannot rot.
147 lines
4.8 KiB
YAML
147 lines
4.8 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 .)
|
|
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 ./...
|
|
# The GitHub Ubuntu runner disables unprivileged user namespaces (AppArmor),
|
|
# so Chrome's sandbox cannot initialize there and the secure default would
|
|
# make it refuse to start. IN_DOCKER is kage's documented escape hatch for
|
|
# exactly that case, and setting it here also exercises the container path.
|
|
# macOS does not need it, so it stays empty on that leg.
|
|
- name: test
|
|
env:
|
|
KAGE_CHROME: ${{ steps.chrome.outputs.chrome-path }}
|
|
IN_DOCKER: ${{ matrix.os == 'ubuntu-latest' && '1' || '' }}
|
|
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
|
|
|
|
# Compile the optional native-window viewer (-tags webview, cgo) so that path
|
|
# keeps building. The default CI build is pure Go and never touches it. The
|
|
# viewer code is the same Go on every OS, only the system WebView library
|
|
# differs, so a macOS compile (WebKit ships in the SDK) catches our
|
|
# regressions without the WebKitGTK version juggling Linux runners need. It is
|
|
# build-only: actually opening a window needs a display.
|
|
webview:
|
|
runs-on: macos-latest
|
|
steps:
|
|
- uses: actions/checkout@v5
|
|
- uses: actions/setup-go@v6
|
|
with:
|
|
go-version-file: go.mod
|
|
check-latest: true
|
|
cache: true
|
|
- name: build webview viewer
|
|
run: CGO_ENABLED=1 go build -tags webview ./cmd/kage
|
|
|
|
# Cross-compile the GUI-subsystem Windows base the release ships for
|
|
# double-click viewers (kage pack --base). A change that breaks the
|
|
# -H windowsgui link is caught here instead of at release time. Pure Go, so it
|
|
# cross-compiles from Linux with no extra toolchain.
|
|
windows-gui:
|
|
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: build windowsgui base
|
|
env:
|
|
GOOS: windows
|
|
CGO_ENABLED: "0"
|
|
run: go build -ldflags "-H=windowsgui" -o kage-windowsgui.exe ./cmd/kage
|