Commit graph

499 commits

Author SHA1 Message Date
Kristoffer Dalby
b36438bf90 all: disable thelper linter and clean up nolint comments
Disable the thelper linter which triggers on inline test closures in
table-driven tests. These closures are intentionally not standalone
helpers and don't benefit from t.Helper().

Also remove explanatory comments from nolint directives throughout the
codebase as they add noise without providing significant value.
2026-01-21 15:56:57 +00:00
Kristoffer Dalby
de1f9b90d5 all: fix godoclint, gosec, testifylint, and thelper lint issues
- Fix godoclint: Ensure doc comments start with symbol name
- Fix gosec: Add nolint directives for false positives (G101, G110, G115, G306, G404)
- Fix testifylint: Use require instead of assert for error checks
- Fix thelper: Add t.Helper() to test helper functions
- Auto-fix gci: Format import statements
2026-01-21 15:55:05 +00:00
Kristoffer Dalby
3770015faa all: fix staticcheck and contextcheck lint issues
- Add nolint:staticcheck for SA1019 deprecation warnings on types.Route
  (kept for GORM migrations only, intentionally deprecated)
- Add nolint:staticcheck for SA4006 false positives where variables are
  used inside new() expressions which staticcheck doesn't recognize
- Fix SA5011 potential nil pointer dereferences in util_test.go by
  using t.Fatal instead of t.Error for nil checks
- Add nolint:contextcheck for functions where context propagation would
  require significant architectural changes (Docker client creation,
  OIDC initialization, scheduled tasks, etc.)
2026-01-21 15:54:38 +00:00
Kristoffer Dalby
d3bddbf172 all: fix exptostd, ineffassign, unconvert, intrange, predeclared issues
- Replace exp/maps and exp/slices with stdlib (Go 1.21+)
- Fix ineffective assignments by checking errors or using blank identifier
- Remove unnecessary type conversions
- Use integer range syntax for loops (Go 1.22+)
- Rename variables shadowing predeclared identifiers (min, max)
2026-01-21 15:54:38 +00:00
Kristoffer Dalby
3b59a91112 all: apply additional wsl_v5 whitespace fixes 2026-01-21 15:54:38 +00:00
Kristoffer Dalby
58b532ae3c all: apply lint auto-fixes and update test expectations
Apply additional golangci-lint auto-fixes (wsl_v5, formatting)
and update SSH policy test error message expectations to match
the new sentinel error formats introduced in the err113 fixes.
2026-01-21 15:54:38 +00:00
Kristoffer Dalby
8bfd508cf0 all: apply testifylint fixes and correct auto-fix issues
- Apply testifylint auto-fixes (assert.Positive, fmt.Sprintf in assertions)
- Fix incorrect := to = conversions introduced by auto-fixer
- Revert broken slices.AppendSeq FIXME placeholder
2026-01-21 15:54:38 +00:00
Kristoffer Dalby
12b3da0181 all: extract remaining magic numbers to named constants
Define named constants for various timeout and configuration values:
- Connection validation and retry timeouts in helpers
- Peer sync timeouts in integrationutil
- Run ID hash length and parts in dockertestutil
- Container memory limits and directory permissions
- HTML parsing split count in scenario
- Container restart and backoff timeouts in tsic
- Stats calculation constants in cmd/hi
2026-01-21 15:54:38 +00:00
Kristoffer Dalby
f969745db4 integration: define sentinel errors for err113 compliance
Add sentinel errors across integration test infrastructure and test
files to comply with err113 linter requirements. This replaces inline
dynamic errors with wrapped static sentinel errors.

Files updated:
- integration/tsic/tsic.go: Add errNoNetworkSet, errLogoutFailed,
  errNoIPsReturned, errNoIPv4AddressFound, errBackendStateTimeout,
  errPeerWaitTimeout, errPeerNotOnline, errPeerNoHostname,
  errPeerNoDERP, errFileEmpty, errTailscaleVersionRequired
- integration/scenario.go: Add errUserAlreadyInNetwork, errNoNetworkNamed,
  errNoIPAMConfig, errHTTPClientNil, errLoginURLNil,
  errUnexpectedStatusCode, errNetworkDoesNotExist
- integration/helpers.go: Add errExpectedStringNotFound, errUserNotFound,
  errNoNewClientFound, errUnexpectedClientCount
- integration/hsic/hsic.go: Add errDatabaseEmptySchema, errDatabaseFileEmpty,
  errNoRegularFileInTar
- integration/derp_verify_endpoint_test.go: Add errUnexpectedRecvType
- cmd/mapresponses/main.go: Add errDirectoryRequired
- hscontrol/auth_test.go: Add errNodeNotFoundAfterSetup, errInvalidAuthURLFormat
- hscontrol/state/node_store_test.go: Add errTestUpdateNodeFailed,
  errTestGetNodeFailed, errTestPutNodeFailed
2026-01-21 15:54:38 +00:00
Kristoffer Dalby
7cbd3d8d91 all: define sentinel errors for err113 compliance
Add sentinel errors across multiple packages to satisfy the err113 linter:

- cmd/headscale/cli: Add ErrNameOrIDRequired, ErrMultipleUsersFoundUseID,
  errMockOidcUsersNotDefined
- cmd/hi: Add ErrMemoryLimitExceeded, ErrStatsCollectionAlreadyStarted
- hscontrol/db: Add ErrNameNotUnique, ErrTextUnmarshalFailed,
  ErrUnsupportedType, ErrTextMarshalerOnly, ErrTooManyWhereArgs,
  ErrMultipleUsers, fix pak.ID usage
- hscontrol/dns: Add ErrPathIsDirectory
- hscontrol/noise: Add ErrUnsupportedClientVersion
- hscontrol/tailsql: Add ErrNoCertDomains
- hscontrol/types: Add ErrInvalidRegIDLength, errNoPrefixConfigured,
  errInvalidAllocationStrategy, ErrCannotParseBool
- hscontrol/util: Add username/hostname validation errors and
  traceroute parsing errors
2026-01-21 15:54:38 +00:00
Kristoffer Dalby
3843036d13 all: use context-aware methods for exec, database, and HTTP
Replace direct calls with context-aware versions:
- exec.Command → exec.CommandContext
- db.Exec → db.ExecContext
- db.Ping → db.PingContext
- db.QueryRow → db.QueryRowContext
- http.NewRequest → http.NewRequestWithContext
- net.LookupIP → net.DefaultResolver.LookupIPAddr
2026-01-21 15:54:38 +00:00
Kristoffer Dalby
956bcb3680 all: remove unused code and simplify function signatures
Remove unused functions, constants, types, and parameters:
- Remove unused const reservedResponseHeaderSize from batcher_test.go
- Remove unused func getStats from batcher_test.go
- Remove unused func fullMapResponse from mapper.go
- Remove unused type mockState and methods from mapper_test.go
- Remove unused func createTestNodeSimple from maprequest_test.go
- Remove unused const batchSize from node_store_test.go
- Remove unused func ptrTo from change.go
- Remove unused funcs assertClientsState, assertValidNetmap,
  assertValidStatus, assertValidNetcheck, groupOwner from helpers.go

Simplify function signatures by removing unused parameters/returns:
- nodeRoutesToPtables: remove always-nil error return
- parseUpdateAndAnalyze: remove always-nil error return
- parseProtocol: remove unused bool return value
- requireAllClientsOfflineStaged: mark unused params as _
- requireAllClientsNetInfoAndDERP: hardcode constant timeout
- pingAllHelper: remove never-used opts variadic parameter
- node helper in policy_test.go: mark unused hostinfo as _
- drainChannelTimeout: mark unused name parameter as _
2026-01-21 15:54:24 +00:00
Kristoffer Dalby
52fc725cf1 all: check unchecked error returns
Fix errcheck and errchkjson lint issues by properly handling
or explicitly discarding error return values.

Changes include:
- cmd/headscale/cli: Check MarkFlagRequired and AddMiddleware errors
- hscontrol/db: Check VACUUM exec result
- hscontrol/debug: Check Write errors in HTTP handlers
- hscontrol/handlers: Add error logging for JSON encoding
- hscontrol/mapper: Check AddNode errors in tests
- hscontrol/platform_config: Check Write error
- hscontrol/util/prompt: Check Scanln and Write errors
- integration: Check json.Marshal and cleanup function errors
2026-01-21 15:54:24 +00:00
Kristoffer Dalby
15d0efbf9d all: update deprecated Docker and xsync APIs
Update deprecated Docker SDK types and functions:
- errdefs.IsNotFound → cerrdefs.IsNotFound
- errdefs.IsConflict → cerrdefs.IsConflict
- cli.ImageInspectWithRaw → cli.ImageInspect
- client.IsErrNotFound → cerrdefs.IsNotFound
- event.ID → event.Actor.ID
- types.Container → container.Summary
- container.Stats → container.StatsResponse
- xsync.MapOf/NewMapOf → xsync.Map/NewMap

These updates align with the Docker SDK v28+ and xsync v4 API changes.
2026-01-21 15:53:55 +00:00
Kristoffer Dalby
ad7669a2d4 all: apply golangci-lint auto-fixes
Apply auto-fixes from golangci-lint for the following linters:
- wsl_v5: whitespace formatting and blank line adjustments
- godot: add periods to comment sentences
- nlreturn: add newlines before return statements
- perfsprint: optimize fmt.Sprintf to more efficient alternatives

Also add missing imports (errors, encoding/hex) where auto-fix
added new code patterns that require them.
2026-01-21 15:53:55 +00:00
Kristoffer Dalby
094faf7a6a all: modernize sorting with slices package
Replace deprecated sort package functions with their modern
slices package equivalents:

- sort.Slice -> slices.SortFunc
- sort.SliceStable -> slices.SortStableFunc
- sort.Sort -> slices.Sort
- sort.Strings -> slices.Sort

Also removes the now-unused sort.Interface implementation
(Len, Less, Swap methods) from types.NodeIDs since slices.Sort
works directly with ordered types.
2026-01-21 15:52:23 +00:00
Kristoffer Dalby
9ab229675d all: use errors.AsType for type-safe error unwrapping
Replace errors.As with the new errors.AsType generic function
introduced in Go 1.26. This provides compile-time type safety
and approximately 3x better performance by avoiding reflection.

Before:
    var target *AppError
    if errors.As(err, &target) {
        // use target
    }

After:
    if target, ok := errors.AsType[*AppError](err); ok {
        // use target
    }
2026-01-21 15:52:23 +00:00
Shourya Gautam
4e1834adaf
db: use PolicyManager for RequestTags migration
Refactor the RequestTags migration (202601121700-migrate-hostinfo-request-tags)
to use PolicyManager.NodeCanHaveTag() instead of reimplementing tag validation.

Changes:
- NewHeadscaleDatabase now accepts *types.Config to allow migrations
  access to policy configuration
- Add loadPolicyBytes helper to load policy from file or DB based on config
- Add standalone GetPolicy(tx *gorm.DB) for use during migrations
- Replace custom tag validation logic with PolicyManager

Benefits:
- Full HuJSON parsing support (not just JSON)
- Proper group expansion via PolicyManager
- Support for nested tags and autogroups
- Works with both file and database policy modes
- Single source of truth for tag validation


Co-Authored-By: Shourya Gautam <shouryamgautam@gmail.com>
2026-01-21 15:10:29 +01:00
Kristoffer Dalby
e0bae9b769 cli: add --id flag to API key expire/delete commands
Add --id flag as an alternative to --prefix for expiring and
deleting API keys. This allows users to use the ID shown in
'headscale apikeys list' output, which is more convenient than
the prefix.

Either --id or --prefix must be provided; both flags are optional
but at least one is required.

Updates #2986
2026-01-20 17:13:38 +01:00
Kristoffer Dalby
6654142fbe cmd/headscale: migrate tests from check.v1 to testify
Convert config loading tests from gopkg.in/check.v1 Suite-based testing
to standard Go tests with testify assert/require.

Changes:
- Remove Suite boilerplate (Test, Suite type, SetUpSuite, TearDownSuite)
- Convert TestConfigFileLoading and TestConfigLoading to standalone tests
- Replace check assertions with testify equivalents
2026-01-20 15:41:33 +01:00
Kristoffer Dalby
951fd5a8e7 cli: show Owner column in preauthkeys list
Replace the Tags column with an Owner column that displays:
- Tags (newline-separated) if the key has ACL tags
- User name if the key is associated with a user
- Dash (-) if neither is present

This aligns the CLI output with the tags-as-identity model where
preauthkeys can be created with either tags or user ownership.
2026-01-20 12:53:20 +01:00
Kristoffer Dalby
165c5f0491 cli: fix preauthkeys expire/delete argument validation
The Args function incorrectly required positional arguments but
the commands use --id flag. Move validation into Run function.
2026-01-20 12:53:20 +01:00
Kristoffer Dalby
1325fd8b27 cli,hscontrol: use ID-based preauthkey operations 2026-01-20 12:53:20 +01:00
Kristoffer Dalby
0516c0ec37 gen: regenerate protobuf code 2026-01-14 09:32:46 +01:00
Kristoffer Dalby
0bcfdc29ad cmd/hi: enable concurrent test execution
Remove the concurrent test prevention logic and update cleanup to use
run ID-based isolation, allowing multiple tests to run simultaneously.

Changes:
- cleanup: Add killTestContainersByRunID() to clean only containers
  belonging to a specific run, add cleanupStaleTestContainers() to
  remove only stopped/exited containers without affecting running tests
- docker: Remove RunningTestInfo, checkForRunningTests(), and related
  error types, update cleanupAfterTest() to use run ID-based cleanup
- run: Remove Force flag and concurrent test prevention check

The test runner now:
- Allows multiple concurrent test runs on the same Docker daemon
- Cleans only stale containers before tests (not running ones)
- Cleans only containers with matching run ID after tests
- Prints run ID and monitoring info for operator visibility
2026-01-09 12:34:16 +01:00
Kristoffer Dalby
c4600346f9
.github/workflows: prebuilt integration test artifacts (#2954)
Some checks failed
Build / build-nix (push) Has been cancelled
Build / build-cross (GOARCH=amd64 GOOS=darwin) (push) Has been cancelled
Build / build-cross (GOARCH=amd64 GOOS=linux) (push) Has been cancelled
Build / build-cross (GOARCH=arm64 GOOS=darwin) (push) Has been cancelled
Build / build-cross (GOARCH=arm64 GOOS=linux) (push) Has been cancelled
Check Generated Files / check-generated (push) Has been cancelled
NixOS Module Tests / nix-module-check (push) Has been cancelled
Tests / test (push) Has been cancelled
This PR restructures the integration tests and prebuilds all common assets used in all tests:

Headscale and Tailscale HEAD image
hi binary that is used to run tests
go cache is warmed up for compilation of the test
This essentially means we spend 6-10 minutes building assets before any tests starts, when that is done, all tests can just sprint through.

It looks like we are saving 3-9 minutes per test, and since we are limited to running max 20 concurrent tests across the repo, that means we had a lot of double work.

There is currently 113 checks, so we have to do five runs of 20, and the saving should be quite noticeable! I think the "worst case" saving would be 20+min and "best case" probably towards an hour.
2025-12-12 23:01:52 +01:00
Kristoffer Dalby
87bd67318b
golangci-lint: use forbidigo to block time.Sleep (#2946)
Some checks failed
Build / build-nix (push) Has been cancelled
Build / build-cross (GOARCH=amd64 GOOS=darwin) (push) Has been cancelled
Build / build-cross (GOARCH=amd64 GOOS=linux) (push) Has been cancelled
Build / build-cross (GOARCH=arm64 GOOS=darwin) (push) Has been cancelled
Build / build-cross (GOARCH=arm64 GOOS=linux) (push) Has been cancelled
Check Generated Files / check-generated (push) Has been cancelled
NixOS Module Tests / nix-module-check (push) Has been cancelled
Tests / test (push) Has been cancelled
2025-12-10 16:45:59 +00:00
Kristoffer Dalby
0e1673041c
all: remove deadcode (#2952) 2025-12-10 15:55:15 +01:00
Kristoffer Dalby
f3f2d30004
cli: better formatting of lists (#2951)
Some checks are pending
Build / build-nix (push) Waiting to run
Build / build-cross (GOARCH=amd64 GOOS=darwin) (push) Waiting to run
Build / build-cross (GOARCH=amd64 GOOS=linux) (push) Waiting to run
Build / build-cross (GOARCH=arm64 GOOS=darwin) (push) Waiting to run
Build / build-cross (GOARCH=arm64 GOOS=linux) (push) Waiting to run
Check Generated Files / check-generated (push) Waiting to run
NixOS Module Tests / nix-module-check (push) Waiting to run
Tests / test (push) Waiting to run
2025-12-10 12:33:21 +01:00
Rogan Lynch
5d0a6ab0e9 fix: list-routes command now respects identifier filter with JSON output
Fixes #2927

In v0.27.0, the list-routes command with -i flag and -o json output
was returning all nodes instead of just the specified node.

The issue was that JSON output was happening before the identifier
filtering logic. This change moves the JSON output to after both
the identifier filter and route existence filter are applied,
ensuring the correct filtered results are returned.

This restores the v0.26.1 behavior where:
  headscale nodes list-routes -i 12 -o json
correctly returns only node 12's route information.
2025-12-10 06:19:17 +01:00
Kristoffer Dalby
3cf2d7195a auth: ensure machines are allowed in when pak change (#2917) 2025-12-02 12:01:02 +01:00
Kristoffer Dalby
16d811b306
cli: remove node move command (#2922)
Some checks are pending
Build / build-nix (push) Waiting to run
Build / build-cross (GOARCH=amd64 GOOS=darwin) (push) Waiting to run
Build / build-cross (GOARCH=amd64 GOOS=linux) (push) Waiting to run
Build / build-cross (GOARCH=arm64 GOOS=darwin) (push) Waiting to run
Build / build-cross (GOARCH=arm64 GOOS=linux) (push) Waiting to run
Check Generated Files / check-generated (push) Waiting to run
NixOS Module Tests / nix-module-check (push) Waiting to run
Tests / test (push) Waiting to run
2025-12-01 21:43:31 +01:00
Kristoffer Dalby
eec196d200
modernize: run gopls modernize to bring up to 1.25 (#2920) 2025-12-01 19:40:25 +01:00
Kristoffer Dalby
bfcd9d261d
cmd/hi: reject if we are already running (#2919) 2025-12-01 19:40:08 +01:00
Kristoffer Dalby
ed78bf4b98
cmd/hi: improve test cleanup to reduce CI disk usage (#2881) 2025-11-28 16:59:54 +01:00
Kristoffer Dalby
da9018a0eb
types: make pre auth key use bcrypt (#2853)
Some checks are pending
Build / build-nix (push) Waiting to run
Build / build-cross (GOARCH=amd64 GOOS=darwin) (push) Waiting to run
Build / build-cross (GOARCH=amd64 GOOS=linux) (push) Waiting to run
Build / build-cross (GOARCH=arm64 GOOS=darwin) (push) Waiting to run
Build / build-cross (GOARCH=arm64 GOOS=linux) (push) Waiting to run
Check Generated Files / check-generated (push) Waiting to run
NixOS Module Tests / nix-module-check (push) Waiting to run
Tests / test (push) Waiting to run
2025-11-12 16:36:36 +01:00
Kristoffer Dalby
02c7c1a0e7
cli: only validate bypass-grpc set policy (#2854) 2025-11-02 09:42:59 +00:00
Andrey
f9bb88ad24
expire nodes with a custom timestamp (#2828)
Some checks are pending
Build / build-nix (push) Waiting to run
Build / build-cross (GOARCH=amd64 GOOS=darwin) (push) Waiting to run
Build / build-cross (GOARCH=amd64 GOOS=linux) (push) Waiting to run
Build / build-cross (GOARCH=arm64 GOOS=darwin) (push) Waiting to run
Build / build-cross (GOARCH=arm64 GOOS=linux) (push) Waiting to run
Check Generated Files / check-generated (push) Waiting to run
Tests / test (push) Waiting to run
2025-11-01 08:09:13 +01:00
Kristoffer Dalby
c808587de0
cli: do not show new pre-releases on stable (#2813) 2025-10-24 13:15:53 +02:00
Kristoffer Dalby
2bf1200483
policy: fix autogroup:self propagation and optimize cache invalidation (#2807)
Some checks are pending
Build / build-nix (push) Waiting to run
Build / build-cross (GOARCH=amd64 GOOS=darwin) (push) Waiting to run
Build / build-cross (GOARCH=amd64 GOOS=linux) (push) Waiting to run
Build / build-cross (GOARCH=arm64 GOOS=darwin) (push) Waiting to run
Build / build-cross (GOARCH=arm64 GOOS=linux) (push) Waiting to run
Check Generated Files / check-generated (push) Waiting to run
Tests / test (push) Waiting to run
2025-10-23 17:57:41 +02:00
Kristoffer Dalby
4912769ab3
update dependencies (#2798) 2025-10-16 19:03:30 +02:00
Stavros Kois
c07cc491bf
add health command (#2659)
Some checks are pending
Build / build-nix (push) Waiting to run
Build / build-cross (GOARCH=amd64 GOOS=darwin) (push) Waiting to run
Build / build-cross (GOARCH=amd64 GOOS=linux) (push) Waiting to run
Build / build-cross (GOARCH=arm64 GOOS=darwin) (push) Waiting to run
Build / build-cross (GOARCH=arm64 GOOS=linux) (push) Waiting to run
Check Generated Files / check-generated (push) Waiting to run
Deploy docs / deploy (push) Waiting to run
Tests / test (push) Waiting to run
* add health command
* update health check implementation to allow for more checks to added over time
* add change changelog entry
2025-10-16 12:00:11 +00:00
Kristoffer Dalby
2b30a15a68
cmd: add option to get and set policy directly from database (#2765)
Some checks are pending
Build / build-nix (push) Waiting to run
Build / build-cross (GOARCH=amd64 GOOS=darwin) (push) Waiting to run
Build / build-cross (GOARCH=amd64 GOOS=linux) (push) Waiting to run
Build / build-cross (GOARCH=arm64 GOOS=darwin) (push) Waiting to run
Build / build-cross (GOARCH=arm64 GOOS=linux) (push) Waiting to run
Check Generated Files / check-generated (push) Waiting to run
Tests / test (push) Waiting to run
2025-09-12 16:55:15 +02:00
Kristoffer Dalby
3950f8f171
cli: use gobuild version handling (#2770) 2025-09-12 11:47:31 +02:00
Kristoffer Dalby
684239e015 cmd/mapresponses: add mini tool to inspect mapresp state from integration
Signed-off-by: Kristoffer Dalby <kristoffer@tailscale.com>
2025-09-09 09:40:00 +02:00
Kristoffer Dalby
9d236571f4 state/nodestore: in memory representation of nodes
Initial work on a nodestore which stores all of the nodes
and their relations in memory with relationship for peers
precalculated.

It is a copy-on-write structure, replacing the "snapshot"
when a change to the structure occurs. It is optimised for reads,
and while batches are not fast, they are grouped together
to do less of the expensive peer calculation if there are many
changes rapidly.

Writes will block until commited, while reads are never
blocked.

Signed-off-by: Kristoffer Dalby <kristoffer@tailscale.com>
2025-09-09 09:40:00 +02:00
Kristoffer Dalby
3326c5b7ec cmd/hi: lint and format
Signed-off-by: Kristoffer Dalby <kristoffer@tailscale.com>
2025-09-09 09:40:00 +02:00
Kristoffer Dalby
8e25f7f9dd
bunch of qol (#2748)
Some checks failed
Build / build-nix (push) Has been cancelled
Build / build-cross (GOARCH=amd64 GOOS=darwin) (push) Has been cancelled
Build / build-cross (GOARCH=amd64 GOOS=linux) (push) Has been cancelled
Build / build-cross (GOARCH=arm64 GOOS=darwin) (push) Has been cancelled
Build / build-cross (GOARCH=arm64 GOOS=linux) (push) Has been cancelled
Check Generated Files / check-generated (push) Has been cancelled
Tests / test (push) Has been cancelled
2025-08-27 17:09:13 +02:00
Jeff Emershaw
b4f7782fd8 support force flag for nodes backfillips
Some checks failed
Build / build-nix (push) Has been cancelled
Build / build-cross (GOARCH=amd64 GOOS=darwin) (push) Has been cancelled
Build / build-cross (GOARCH=amd64 GOOS=linux) (push) Has been cancelled
Build / build-cross (GOARCH=arm64 GOOS=darwin) (push) Has been cancelled
Build / build-cross (GOARCH=arm64 GOOS=linux) (push) Has been cancelled
Check Generated Files / check-generated (push) Has been cancelled
Tests / test (push) Has been cancelled
2025-08-10 13:31:24 +02:00
Kristoffer Dalby
a058bf3cd3
mapper: produce map before poll (#2628)
Some checks failed
Build / build-nix (push) Has been cancelled
Build / build-cross (GOARCH=amd64 GOOS=darwin) (push) Has been cancelled
Build / build-cross (GOARCH=amd64 GOOS=linux) (push) Has been cancelled
Build / build-cross (GOARCH=arm64 GOOS=darwin) (push) Has been cancelled
Build / build-cross (GOARCH=arm64 GOOS=linux) (push) Has been cancelled
Check Generated Files / check-generated (push) Has been cancelled
Deploy docs / deploy (push) Has been cancelled
Tests / test (push) Has been cancelled
2025-07-28 11:15:53 +02:00