2024-12-11 17:06:56 +00:00
.PHONY : build clean clean -assets e 2e -reset -db e 2e -serve e 2e -setup changelog db -reset db -backup db -restore check -go -cloner update -go -cloner help
2016-09-05 21:58:49 +00:00
2019-08-13 17:32:23 +00:00
export GO111MODULE = on
2021-05-31 18:35:15 +00:00
PATH := $( shell npm bin) :$( PATH)
2016-12-15 16:39:01 +00:00
BRANCH = $( shell git rev-parse --abbrev-ref HEAD)
2026-02-09 14:43:02 +00:00
2026-02-10 19:51:52 +00:00
# If VERSION is not explicitly set, derive it from the branch name
2026-02-09 14:43:02 +00:00
i f n d e f V E R S I O N
2026-02-10 19:51:52 +00:00
VERSION := $( shell tools/version-from-branch.sh " $( BRANCH) " 2>/dev/null)
# Fall back to git describe when the branch name doesn't match any pattern
2026-02-09 14:43:02 +00:00
ifeq ( $( VERSION) ,)
VERSION := $( shell git describe --tags --always --dirty)
endif
e n d i f
2016-12-15 16:39:01 +00:00
REVISION = $( shell git rev-parse HEAD)
REVSHORT = $( shell git rev-parse --short HEAD)
USER = $( shell whoami)
2020-11-05 06:16:51 +00:00
DOCKER_IMAGE_NAME = fleetdm/fleet
2025-02-28 13:42:32 +00:00
# The tool that was called on the command line (probably `make` or `fdm`).
TOOL_CMD = "make"
2016-10-12 16:25:59 +00:00
2022-07-11 11:12:33 +00:00
i f d e f G O _ B U I L D _ R A C E _ E N A B L E D
GO_BUILD_RACE_ENABLED_VAR := true
2022-02-14 19:38:53 +00:00
e l s e
2022-07-11 11:12:33 +00:00
GO_BUILD_RACE_ENABLED_VAR := false
2022-02-14 19:38:53 +00:00
e n d i f
2016-09-20 18:03:42 +00:00
i f n e q ( $( OS ) , W i n d o w s _ N T )
2016-12-15 16:39:01 +00:00
# If on macOS, set the shell to bash explicitly
2016-09-20 18:03:42 +00:00
ifeq ( $( shell uname) , Darwin)
SHELL := /bin/bash
endif
2016-08-10 05:15:44 +00:00
2016-12-15 16:39:01 +00:00
# The output binary name is different on Windows, so we're explicit here
2017-10-16 23:35:14 +00:00
OUTPUT = fleet
2016-08-10 05:15:44 +00:00
2016-12-15 16:39:01 +00:00
# To populate version metadata, we use unix tools to get certain data
GOVERSION = $( shell go version | awk '{print $$3}' )
2021-04-16 23:14:56 +00:00
NOW = $( shell date +"%Y-%m-%d" )
2016-12-15 16:39:01 +00:00
e l s e
# The output binary name is different on Windows, so we're explicit here
2017-10-16 23:35:14 +00:00
OUTPUT = fleet.exe
2016-09-20 02:37:47 +00:00
2016-12-15 16:39:01 +00:00
# To populate version metadata, we use windows tools to get the certain data
2016-09-20 02:37:47 +00:00
GOVERSION_CMD = "(go version).Split()[2]"
GOVERSION = $( shell powershell $( GOVERSION_CMD) )
2021-04-16 23:14:56 +00:00
NOW = $( shell powershell Get-Date -format "yyy-MM-dd" )
2016-09-04 05:13:42 +00:00
e n d i f
2016-09-19 22:54:57 +00:00
i f n d e f C I R C L E _ P R _ N U M B E R
2016-12-08 17:54:21 +00:00
DOCKER_IMAGE_TAG = ${ REVSHORT }
2016-09-19 22:54:57 +00:00
e l s e
2016-12-08 17:54:21 +00:00
DOCKER_IMAGE_TAG = dev-${ CIRCLE_PR_NUMBER } -${ REVSHORT }
2016-09-20 02:37:47 +00:00
e n d i f
2017-02-02 16:30:23 +00:00
i f d e f C I R C L E _ T A G
DOCKER_IMAGE_TAG = ${ CIRCLE_TAG }
e n d i f
2026-04-03 14:58:03 +00:00
LDFLAGS_VERSION_RAW = \
2024-01-02 21:22:52 +00:00
-X github.com/fleetdm/fleet/v4/server/version.appName= ${ APP_NAME } \
-X github.com/fleetdm/fleet/v4/server/version.version= ${ VERSION } \
-X github.com/fleetdm/fleet/v4/server/version.branch= ${ BRANCH } \
-X github.com/fleetdm/fleet/v4/server/version.revision= ${ REVISION } \
-X github.com/fleetdm/fleet/v4/server/version.buildDate= ${ NOW } \
-X github.com/fleetdm/fleet/v4/server/version.buildUser= ${ USER } \
2026-04-03 14:58:03 +00:00
-X github.com/fleetdm/fleet/v4/server/version.goVersion= ${ GOVERSION }
LDFLAGS_VERSION = " ${ LDFLAGS_VERSION_RAW } "
LDFLAGS_VERSION_STATIC = " ${ LDFLAGS_VERSION_RAW } -extldflags '-static' "
2017-10-12 16:42:13 +00:00
2025-04-07 14:10:15 +00:00
# Macro to allow targets to filter out their own arguments from the arguments
# passed to the final command.
# Targets may also add their own CLI arguments to the command as EXTRA_CLI_ARGS.
# See `serve` target for an example.
d e f i n e f i l t e r _ a r g s
$(eval FORWARDED_ARGS : = $( filter -out $ ( TARGET_ARGS ) , $ ( CLI_ARGS ) ) )
$(eval FORWARDED_ARGS : = $( FORWARDED_ARGS ) $( EXTRA_CLI_ARGS ) )
e n d e f
2016-09-20 02:37:47 +00:00
all : build
.prefix :
2017-10-16 23:35:14 +00:00
mkdir -p build/linux
mkdir -p build/darwin
2016-09-14 17:19:11 +00:00
2017-10-16 23:35:14 +00:00
.pre-build :
$( eval GOGC = off)
$( eval CGO_ENABLED = 0)
.pre-fleet :
2017-10-12 16:42:13 +00:00
$( eval APP_NAME = fleet)
2017-10-16 23:35:14 +00:00
2017-11-12 18:58:19 +00:00
.pre-fleetctl :
$( eval APP_NAME = fleetctl)
2025-02-28 13:42:32 +00:00
# For the build target, decide which binaries to build.
2025-04-24 21:03:21 +00:00
# Default to building both
BINS_TO_BUILD = fleet fleetctl
2025-02-28 13:42:32 +00:00
i f e q ( b u i l d , $( filter build ,$ ( MAKECMDGOALS ) ) )
BINS_TO_BUILD = fleet fleetctl
ifeq ( $( ARG1) , fleet)
BINS_TO_BUILD = fleet
else ifeq ( $( ARG1) , fleetctl)
BINS_TO_BUILD = fleetctl
endif
e n d i f
.help-short--build :
@echo "Build binaries"
.help-long--build :
@echo "Builds the specified binaries (defaults to building fleet and fleetctl)"
.help-usage--build :
2025-04-11 14:18:28 +00:00
@echo " $( TOOL_CMD) build [binaries] [options] "
2025-02-28 13:42:32 +00:00
.help-options--build :
@echo "GO_BUILD_RACE_ENABLED"
@echo "Turn on data race detection when building"
@echo "EXTRA_FLEETCTL_LDFLAGS=\"--flag1 --flag2...\""
@echo "Flags to provide to the Go linker when building fleetctl"
.help-extra--build :
@echo "AVAILABLE BINARIES:"
@echo " fleet Build the fleet binary"
@echo " fleetctl Build the fleetctl binary"
build : $( BINS_TO_BUILD )
.help-short--fdm :
@echo "Builds the fdm command"
fdm :
go build -o build/fdm ./tools/fdm
@if [ ! -f /usr/local/bin/fdm ] ; then \
echo "Linking to /usr/local/bin/fdm..." ; \
sudo ln -sf " $$ (pwd)/build/fdm " /usr/local/bin/fdm; \
fi
2017-11-12 18:58:19 +00:00
2025-04-07 17:52:26 +00:00
.help-short--serve :
2025-04-07 14:10:15 +00:00
@echo "Start the fleet server"
2025-04-07 17:52:26 +00:00
.help-short--up :
2025-04-07 14:10:15 +00:00
@echo "Start the fleet server (alias for \`serve\`)"
.help-long--serve : SERVE_CMD :=serve
.help-long--up : SERVE_CMD :=up
.help-long--serve .help-long--up :
2025-04-07 17:52:26 +00:00
@echo "Starts an instance of the Fleet web and API server."
2025-04-07 14:10:15 +00:00
@echo
@echo " By default the server will listen on localhost:8080, in development mode with a premium license."
@echo " If different options are used to start the server, the options will become 'sticky' and will be used the next time \` $( TOOL_CMD) $( SERVE_CMD) \` is called. "
@echo
@echo " To see all available options, run \` $( TOOL_CMD) $( SERVE_CMD) --help\` "
.help-options--serve .help-options--up :
@echo "HELP"
@echo "Show all options for the fleet serve command"
@echo "USE_IP"
@echo "Start the server on the IP address of the host machine"
@echo "NO_BUILD"
@echo "Don't build the fleet binary before starting the server"
@echo "NO_SAVE"
@echo "Don't save the current arguments for the next invocation"
@echo "SHOW"
@echo "Show the last arguments used to start the server"
up : SERVE_CMD :=up
up : serve
serve : SERVE_CMD :=serve
serve : TARGET_ARGS := --use -ip --no -save --show --no -build
i f d e f U S E _ I P
serve : EXTRA_CLI_ARGS := $( EXTRA_CLI_ARGS ) --server_address =$( shell ipconfig getifaddr en 0) :8080
e n d i f
i f d e f S H O W
serve :
@SAVED_ARGS= $$ ( cat ~/.fleet/last-serve-invocation) ; \
if [ [ $$ ? -eq 0 ] ] ; then \
echo " $$ SAVED_ARGS " ; \
fi
e l s e i f d e f H E L P
serve :
@./build/fleet serve --help
e l s e i f d e f R E S E T
serve :
@touch ~/.fleet/last-serve-invocation && rm ~/.fleet/last-serve-invocation
e l s e
serve :
@if [ [ " $( NO_BUILD) " != "true" ] ] ; then make fleet; fi
$( call filter_args)
# If FORWARDED_ARGS is not empty, run the command with the forwarded arguments.
# Unless NO_SAVE is set to true, save the command to the last invocation file.
# IF FORWARDED_ARGS is empty, attempt to repeat the last invocation.
@if [ [ " $( FORWARDED_ARGS) " != "" ] ] ; then \
if [ [ " $( NO_SAVE) " != "true" ] ] ; then \
echo " ./build/fleet serve $( FORWARDED_ARGS) " > ~/.fleet/last-serve-invocation; \
fi ; \
./build/fleet serve $( FORWARDED_ARGS) ; \
else \
if ! [ [ -f ~/.fleet/last-serve-invocation ] ] ; then \
echo "./build/fleet serve --server_address=localhost:8080 --dev --dev_license" > ~/.fleet/last-serve-invocation; \
fi ; \
cat ~/.fleet/last-serve-invocation; \
$$ ( cat ~/.fleet/last-serve-invocation) ; \
fi
e n d i f
2017-11-12 18:58:19 +00:00
fleet : .prefix .pre -build .pre -fleet
2024-01-02 21:22:52 +00:00
CGO_ENABLED = 1 go build -race= ${ GO_BUILD_RACE_ENABLED_VAR } -tags full,fts5,netgo -o build/${ OUTPUT } -ldflags ${ LDFLAGS_VERSION } ./cmd/fleet
2022-06-29 17:38:23 +00:00
2026-04-03 14:58:03 +00:00
fleet-static : .prefix .pre -build .pre -fleet
CGO_ENABLED = 1 go build -tags full,fts5,netgo -trimpath -o build/${ OUTPUT } -ldflags ${ LDFLAGS_VERSION_STATIC } ./cmd/fleet
2022-07-11 11:12:33 +00:00
fleet-dev : GO_BUILD_RACE_ENABLED_VAR =true
2022-06-29 17:38:23 +00:00
fleet-dev : fleet
2016-09-14 17:19:11 +00:00
2017-11-12 18:58:19 +00:00
fleetctl : .prefix .pre -build .pre -fleetctl
2022-07-11 11:12:33 +00:00
# Race requires cgo
$( eval CGO_ENABLED := $( shell [ [ " ${ GO_BUILD_RACE_ENABLED_VAR } " = "true" ] ] && echo 1 || echo 0) )
2024-10-28 23:40:19 +00:00
$( eval FLEETCTL_LDFLAGS := $( shell echo " ${ LDFLAGS_VERSION } ${ EXTRA_FLEETCTL_LDFLAGS } " ) )
CGO_ENABLED = ${ CGO_ENABLED } go build -race= ${ GO_BUILD_RACE_ENABLED_VAR } -o build/fleetctl -ldflags= " ${ FLEETCTL_LDFLAGS } " ./cmd/fleetctl
2022-07-11 11:12:33 +00:00
fleetctl-dev : GO_BUILD_RACE_ENABLED_VAR =true
fleetctl-dev : fleetctl
2017-11-12 18:58:19 +00:00
2025-02-28 13:42:32 +00:00
.help-short--lint-js :
@echo "Run the JavaScript linters"
2016-09-06 21:00:34 +00:00
lint-js :
2021-03-05 01:13:28 +00:00
yarn lint
2016-09-06 21:00:34 +00:00
2025-02-28 13:42:32 +00:00
.help-short--lint-go :
@echo "Run the Go linters"
2016-09-06 21:00:34 +00:00
lint-go :
2026-02-20 13:15:23 +00:00
golangci-lint run --timeout 15m
2025-12-08 15:06:05 +00:00
i f n d e f S K I P _ I N C R E M E N T A L
2026-02-06 14:51:17 +00:00
$( MAKE) lint-go-incremental
2025-12-08 15:06:05 +00:00
e n d i f
2016-09-06 21:00:34 +00:00
2026-02-06 14:51:17 +00:00
.help-short--lint-go-incremental :
@echo "Run the incremental Go linters"
lint-go-incremental : custom -gcl
./custom-gcl run -c .golangci-incremental.yml --new-from-merge-base= origin/main --timeout 15m ./...
custom-gcl :
golangci-lint custom
2025-02-28 13:42:32 +00:00
.help-short--lint :
@echo "Run linters"
.help-long--lint :
@echo "Runs the linters for Go and Javascript code. If linter type is not specified, all linters will be run."
.help-usage--lint :
2025-04-11 14:18:28 +00:00
@echo " $( TOOL_CMD) lint [linter-type] "
2025-02-28 13:42:32 +00:00
.help-extra--lint :
@echo "AVAILABLE LINTERS:"
@echo " go Lint Go files with golangci-lint"
@echo " js Lint .js, .jsx, .ts and .tsx files with eslint"
i f d e f A R G 1
lint : lint -$( ARG 1)
e l s e
2021-03-05 01:13:28 +00:00
lint : lint -go lint -js
2025-02-28 13:42:32 +00:00
e n d i f
2016-09-06 21:00:34 +00:00
2025-02-28 13:42:32 +00:00
.help-short--test-schema :
@echo "Update schema.sql from current migrations"
test-schema :
2025-08-25 15:41:28 +00:00
go run ./tools/dbutils ./server/datastore/mysql/schema.sql
2025-02-28 13:42:32 +00:00
dump-test-schema : test -schema
2024-12-11 17:06:56 +00:00
# This is the base command to run Go tests.
# Wrap this to run tests with presets (see `run-go-tests` and `test-go` targets).
# PKG_TO_TEST: Go packages to test, e.g. "server/datastore/mysql". Separate multiple packages with spaces.
# TESTS_TO_RUN: Name specific tests to run in the specified packages. Leave blank to run all tests in the specified packages.
# GO_TEST_EXTRA_FLAGS: Used to specify other arguments to `go test`.
2025-04-11 14:18:28 +00:00
# GO_TEST_MAKE_FLAGS: Internal var used by other targets to add arguments to `go test`.
2025-02-28 13:42:32 +00:00
PKG_TO_TEST := ""
2026-02-27 13:53:57 +00:00
COVER_PKG ?= github.com/fleetdm/fleet/v4/...
2024-12-11 17:06:56 +00:00
go_test_pkg_to_test := $( addprefix ./,$( PKG_TO_TEST) ) # set paths for packages to test
dlv_test_pkg_to_test := $( addprefix github.com/fleetdm/fleet/v4/,$( PKG_TO_TEST) ) # set URIs for packages to debug
.run-go-tests :
i f e q ( $( PKG_TO_TEST ) , "" )
2025-04-11 14:18:28 +00:00
@echo " Please specify one or more packages to test. See ' $( TOOL_CMD) help run-go-tests' for more info. " ;
2026-03-03 22:01:11 +00:00
e l s e
i f d e f U S E _ G O T E S T S U M
@echo Running Go tests with gotestsum:
gotestsum --format= $( GOTESTSUM_FORMAT) --jsonfile= /tmp/test-output.json -- -tags full,fts5,netgo -run= ${ TESTS_TO_RUN } ${ GO_TEST_MAKE_FLAGS } ${ GO_TEST_EXTRA_FLAGS } -parallel 8 -coverprofile= coverage.txt -covermode= atomic -coverpkg= $( COVER_PKG) $( go_test_pkg_to_test)
2024-12-11 17:06:56 +00:00
e l s e
@echo Running Go tests with command:
2026-02-27 13:53:57 +00:00
go test -tags full,fts5,netgo -run= ${ TESTS_TO_RUN } ${ GO_TEST_MAKE_FLAGS } ${ GO_TEST_EXTRA_FLAGS } -parallel 8 -coverprofile= coverage.txt -covermode= atomic -coverpkg= $( COVER_PKG) $( go_test_pkg_to_test)
2024-12-11 17:06:56 +00:00
e n d i f
2026-03-03 22:01:11 +00:00
e n d i f
2024-12-11 17:06:56 +00:00
# This is the base command to debug Go tests.
# Wrap this to run tests with presets (see `debug-go-tests`)
# DEBUG_TEST_EXTRA_FLAGS: Internal var used by other targets to add arguments to `dlv test`.
.debug-go-tests :
i f e q ( $( PKG_TO_TEST ) , "" )
2025-04-11 14:18:28 +00:00
@echo " Please specify one or more packages to debug. See ' $( TOOL_CMD) help run-go-tests' for more info. " ;
2024-12-11 17:06:56 +00:00
e l s e
@echo Debugging tests with command:
2025-01-09 18:38:24 +00:00
dlv test ${ dlv_test_pkg_to_test } --api-version= 2 --listen= 127.0.0.1:61179 ${ DEBUG_TEST_EXTRA_FLAGS } -- -test.v -test.run= ${ TESTS_TO_RUN } ${ GO_TEST_EXTRA_FLAGS }
2024-12-11 17:06:56 +00:00
e n d i f
2025-02-28 13:42:32 +00:00
.help-short--run-go-tests :
@echo "Run Go tests in specific packages"
.help-long--run-go-tests :
@echo Command to run specific tests in development. Can run all tests for one or more packages, or specific tests within packages.
.help-options--run-go-tests :
@echo "PKG_TO_TEST=\"pkg1 pkg2...\""
@echo "Go packages to test, e.g. \"server/datastore/mysql\". Separate multiple packages with spaces."
@echo "TESTS_TO_RUN=\"test\""
@echo Name specific tests to debug in the specified packages. Leave blank to debug all tests in the specified packages.
@echo "GO_TEST_EXTRA_FLAGS=\"--flag1 --flag2...\""
@echo "Arguments to send to \"go test\"."
2024-12-11 17:06:56 +00:00
run-go-tests :
2025-12-10 16:03:48 +00:00
@MYSQL_TEST= 1 REDIS_TEST = 1 S3_STORAGE_TEST = 1 SAML_IDP_TEST = 1 NETWORK_TEST = 1 make .run-go-tests GO_TEST_MAKE_FLAGS = "-v"
2024-12-11 17:06:56 +00:00
2025-02-28 13:42:32 +00:00
.help-short--debug-go-tests :
@echo "Debug Go tests in specific packages (with Delve)"
.help-long--debug-go-tests :
@echo Command to run specific tests in the Go debugger. Can run all tests for one or more packages, or specific tests within packages.
.help-options--debug-go-tests :
@echo "PKG_TO_TEST=\"pkg1 pkg2...\""
@echo "Go packages to test, e.g. \"server/datastore/mysql\". Separate multiple packages with spaces."
@echo "TESTS_TO_RUN=\"test\""
@echo Name specific tests to debug in the specified packages. Leave blank to debug all tests in the specified packages.
@echo "GO_TEST_EXTRA_FLAGS=\"--flag1 --flag2...\""
@echo "Arguments to send to \"go test\"."
2024-12-11 17:06:56 +00:00
debug-go-tests :
2025-12-10 16:03:48 +00:00
@MYSQL_TEST= 1 REDIS_TEST = 1 S3_STORAGE_TEST = 1 SAML_IDP_TEST = 1 NETWORK_TEST = 1 make .debug-go-tests
2024-12-11 17:06:56 +00:00
2025-02-28 13:42:32 +00:00
# Set up packages for CI testing.
2026-03-26 13:59:42 +00:00
DEFAULT_PKGS_TO_TEST := ./cmd/... ./ee/... ./orbit/pkg/... ./orbit/cmd/orbit ./pkg/... ./server/... ./tools/... ./client/...
2025-04-07 17:52:26 +00:00
# fast tests are quick and do not require out-of-process dependencies (such as MySQL, etc.)
FAST_PKGS_TO_TEST := \
2026-03-26 13:59:42 +00:00
./client \
./ee/pkg/hostidentity/types \
2025-04-07 17:52:26 +00:00
./ee/tools/mdm \
./orbit/pkg/cryptoinfo \
./orbit/pkg/dataflatten \
./orbit/pkg/keystore \
./server/goose \
./server/mdm/apple/appmanifest \
./server/mdm/lifecycle \
./server/mdm/scep/challenge \
./server/mdm/scep/x509util \
./server/policies
FLEETCTL_PKGS_TO_TEST := ./cmd/fleetctl/...
2025-08-25 15:41:28 +00:00
MYSQL_PKGS_TO_TEST := ./server/datastore/mysql/...
2025-04-07 17:52:26 +00:00
SCRIPTS_PKGS_TO_TEST := ./orbit/pkg/scripts
SERVICE_PKGS_TO_TEST := ./server/service
VULN_PKGS_TO_TEST := ./server/vulnerabilities/...
2026-02-27 13:53:57 +00:00
ACTIVITY_PKGS_TO_TEST := ./server/activity/...
2025-02-28 13:42:32 +00:00
i f e q ( $( CI_TEST_PKG ) , m a i n )
2025-04-07 17:52:26 +00:00
# This is the bucket of all the tests that are not in a specific group. We take a diff between DEFAULT_PKG_TO_TEST and all the specific *_PKGS_TO_TEST.
CI_PKG_TO_TEST = $( shell /bin/bash -c " comm -23 <(go list ${ DEFAULT_PKGS_TO_TEST } | sort) <({ \
go list $( FAST_PKGS_TO_TEST) && \
go list $( FLEETCTL_PKGS_TO_TEST) && \
go list $( MYSQL_PKGS_TO_TEST) && \
go list $( SCRIPTS_PKGS_TO_TEST) && \
go list $( SERVICE_PKGS_TO_TEST) && \
2026-02-27 13:53:57 +00:00
go list $( VULN_PKGS_TO_TEST) && \
go list $( ACTIVITY_PKGS_TO_TEST) \
2025-04-07 17:52:26 +00:00
; } | sort) | sed -e 's|github.com/fleetdm/fleet/v4/||g' " )
e l s e i f e q ( $( CI_TEST_PKG ) , f a s t )
CI_PKG_TO_TEST = $( FAST_PKGS_TO_TEST)
2025-02-28 13:42:32 +00:00
e l s e i f e q ( $( CI_TEST_PKG ) , f l e e t c t l )
2025-04-07 17:52:26 +00:00
CI_PKG_TO_TEST = $( FLEETCTL_PKGS_TO_TEST)
e l s e i f e q ( $( CI_TEST_PKG ) , m y s q l )
CI_PKG_TO_TEST = $( MYSQL_PKGS_TO_TEST)
e l s e i f e q ( $( CI_TEST_PKG ) , s c r i p t s )
CI_PKG_TO_TEST = $( SCRIPTS_PKGS_TO_TEST)
e l s e i f e q ( $( CI_TEST_PKG ) , s e r v i c e )
CI_PKG_TO_TEST = $( SERVICE_PKGS_TO_TEST)
2025-02-28 13:42:32 +00:00
e l s e i f e q ( $( CI_TEST_PKG ) , v u l n )
2025-04-07 17:52:26 +00:00
CI_PKG_TO_TEST = $( VULN_PKGS_TO_TEST)
2026-02-27 13:53:57 +00:00
e l s e i f e q ( $( CI_TEST_PKG ) , a c t i v i t y )
CI_PKG_TO_TEST = $( ACTIVITY_PKGS_TO_TEST)
2025-02-28 13:42:32 +00:00
e l s e
2025-04-07 17:52:26 +00:00
CI_PKG_TO_TEST = $( DEFAULT_PKGS_TO_TEST)
2025-02-28 13:42:32 +00:00
e n d i f
2024-12-11 17:06:56 +00:00
# Command used in CI to run all tests.
2025-02-28 13:42:32 +00:00
.help-short--test-go :
@echo "Run Go tests for CI"
.help-long--test-go :
@echo "Run one or more bundle of Go tests. These are bundled together to try and make CI testing more parallelizable (and thus faster)."
.help-options--test-go :
@echo "CI_TEST_PKG=[test package]"
@echo "The test package bundle to run. If not specified, all Go tests will run."
.help-extra--test-go :
@echo "AVAILABLE TEST BUNDLES:"
2025-04-07 17:52:26 +00:00
@echo " fast"
@echo " service"
@echo " scripts"
2025-02-28 13:42:32 +00:00
@echo " mysql"
@echo " fleetctl"
@echo " vuln"
2026-02-27 13:53:57 +00:00
@echo " activity"
2025-02-28 13:42:32 +00:00
@echo " main (all tests not included in other bundles)"
2025-04-07 17:52:26 +00:00
test-go :
2025-01-09 18:38:24 +00:00
make .run-go-tests PKG_TO_TEST = " $( CI_PKG_TO_TEST) "
2017-01-04 21:59:17 +00:00
analyze-go :
2021-08-16 18:48:45 +00:00
go test -tags full,fts5,netgo -race -cover ./...
2017-01-04 21:59:17 +00:00
2025-02-28 13:42:32 +00:00
.help-short--test-js :
@echo "Run the JavaScript tests"
2016-09-06 21:00:34 +00:00
test-js :
2024-03-13 12:45:28 +00:00
yarn test
2016-09-06 21:00:34 +00:00
2025-02-28 13:42:32 +00:00
.help-short--test :
@echo "Run the full test suite (lint, Go and Javascript -- used in CI)"
2016-10-31 13:56:13 +00:00
test : lint test -go test -js
2016-09-04 05:13:42 +00:00
2025-02-28 13:42:32 +00:00
.help-short--generate :
@echo "Generate and bundle required Go code and Javascript code"
2021-03-05 02:16:20 +00:00
generate : clean -assets generate -js generate -go
2019-07-29 16:31:42 +00:00
2021-04-16 23:14:56 +00:00
generate-ci :
2023-02-20 17:35:15 +00:00
NODE_OPTIONS = --openssl-legacy-provider NODE_ENV = development yarn run webpack
2021-04-16 23:14:56 +00:00
make generate-go
2025-02-28 13:42:32 +00:00
.help-short--generate-js :
@echo "Generate and bundle required js code"
2021-03-05 02:16:20 +00:00
generate-js : clean -assets .prefix
2023-04-14 14:58:54 +00:00
NODE_ENV = production yarn run webpack --progress
2019-07-29 16:31:42 +00:00
2025-02-28 13:42:32 +00:00
.help-short--generate-go :
@echo "Generate and bundle required go code"
2019-07-29 16:31:42 +00:00
generate-go : .prefix
2021-03-22 18:03:03 +00:00
go run github.com/kevinburke/go-bindata/go-bindata -pkg= bindata -tags full \
2020-03-30 02:22:04 +00:00
-o= server/bindata/generated.go \
frontend/templates/ assets/... server/mail/templates
2016-09-06 15:08:11 +00:00
2021-10-27 23:17:41 +00:00
# we first generate the webpack bundle so that bindata knows to atch the
2016-09-22 00:40:26 +00:00
# output bundle file. then, generate debug bindata source file. finally, we
# run webpack in watch mode to continuously re-generate the bundle
2025-02-28 13:42:32 +00:00
.help-short--generate-dev :
@echo "Generate and bundle required Javascript code in a watch loop"
2016-09-06 15:08:11 +00:00
generate-dev : .prefix
2023-04-14 14:58:54 +00:00
NODE_ENV = development yarn run webpack --progress
2021-03-22 18:03:03 +00:00
go run github.com/kevinburke/go-bindata/go-bindata -debug -pkg= bindata -tags full \
2020-03-30 02:22:04 +00:00
-o= server/bindata/generated.go \
frontend/templates/ assets/... server/mail/templates
2023-04-14 14:58:54 +00:00
NODE_ENV = development yarn run webpack --progress --watch
2016-08-10 05:15:44 +00:00
2025-02-28 13:42:32 +00:00
.help-short--mock :
@echo "Update mock data store"
mock : .prefix
2025-02-26 16:47:05 +00:00
go generate github.com/fleetdm/fleet/v4/server/mock github.com/fleetdm/fleet/v4/server/mock/mockresult github.com/fleetdm/fleet/v4/server/service/mock github.com/fleetdm/fleet/v4/server/mdm/android/mock
2025-02-28 13:42:32 +00:00
generate-mock : mock
2021-08-10 13:43:27 +00:00
2025-02-28 13:42:32 +00:00
.help-short--doc :
@echo "Generate updated API documentation for activities, osquery flags"
doc : .prefix
2022-12-23 16:05:16 +00:00
go generate github.com/fleetdm/fleet/v4/server/fleet
2023-01-19 20:44:03 +00:00
go generate github.com/fleetdm/fleet/v4/server/service/osquery_utils
2025-04-16 14:50:10 +00:00
2025-08-11 19:55:31 +00:00
generate-doc : doc
2022-12-23 16:05:16 +00:00
2025-02-28 13:42:32 +00:00
.help-short--deps :
@echo "Install dependent programs and libraries"
2025-04-07 14:12:05 +00:00
deps : deps -js
2019-07-29 16:31:42 +00:00
deps-js :
2017-02-10 18:22:26 +00:00
yarn
2019-07-29 16:31:42 +00:00
2023-12-06 19:34:22 +00:00
# check that the generated files in tools/cloner-check/generated_files match
# the current version of the cloneable structures.
check-go-cloner :
go run ./tools/cloner-check/main.go --check
# update the files in tools/cloner-check/generated_files with the current
# version of the cloneable structures.
update-go-cloner :
go run ./tools/cloner-check/main.go --update
2025-02-28 13:42:32 +00:00
.help-short--migration :
@echo "Create a database migration file (supply name=TheNameOfYourMigration)"
2021-02-05 17:48:06 +00:00
migration :
2024-01-02 20:52:00 +00:00
go run ./server/goose/cmd/goose -dir server/datastore/mysql/migrations/tables create $( name)
2022-04-05 16:56:15 +00:00
gofmt -w server/datastore/mysql/migrations/tables/*_$( name) *.go
2021-02-05 17:48:06 +00:00
2025-02-28 13:42:32 +00:00
.help-short--clean :
@echo "Clean all build artifacts"
2021-03-05 02:16:20 +00:00
clean : clean -assets
2016-09-20 02:37:47 +00:00
rm -rf build vendor
rm -f assets/bundle.js
2016-08-10 05:15:44 +00:00
2025-02-28 13:42:32 +00:00
.help-short--clean-assets :
@echo "Clean assets only"
2021-03-05 02:16:20 +00:00
clean-assets :
git clean -fx assets
2022-07-11 12:49:13 +00:00
fleetctl-docker : xp -fleetctl
docker build -t fleetdm/fleetctl --platform= linux/amd64 -f tools/fleetctl-docker/Dockerfile .
2024-08-20 17:07:59 +00:00
bomutils-docker :
cd tools/bomutils-docker && docker build -t fleetdm/bomutils --platform= linux/amd64 -f Dockerfile .
wix-docker :
cd tools/wix-docker && docker build -t fleetdm/wix --platform= linux/amd64 -f Dockerfile .
2018-05-23 19:19:01 +00:00
.pre-binary-bundle :
2017-10-18 16:45:01 +00:00
rm -rf build/binary-bundle
mkdir -p build/binary-bundle/linux
mkdir -p build/binary-bundle/darwin
2018-05-23 19:19:01 +00:00
xp-fleet : .pre -binary -bundle .pre -fleet generate
2024-01-02 21:22:52 +00:00
CGO_ENABLED = 1 GOOS = linux go build -tags full,fts5,netgo -trimpath -o build/binary-bundle/linux/fleet -ldflags ${ LDFLAGS_VERSION } ./cmd/fleet
CGO_ENABLED = 1 GOOS = darwin go build -tags full,fts5,netgo -trimpath -o build/binary-bundle/darwin/fleet -ldflags ${ LDFLAGS_VERSION } ./cmd/fleet
CGO_ENABLED = 1 GOOS = windows go build -tags full,fts5,netgo -trimpath -o build/binary-bundle/windows/fleet.exe -ldflags ${ LDFLAGS_VERSION } ./cmd/fleet
2018-05-23 19:19:01 +00:00
2020-09-27 16:45:22 +00:00
xp-fleetctl : .pre -binary -bundle .pre -fleetctl generate -go
2024-01-02 21:22:52 +00:00
CGO_ENABLED = 0 GOOS = linux go build -trimpath -o build/binary-bundle/linux/fleetctl -ldflags ${ LDFLAGS_VERSION } ./cmd/fleetctl
CGO_ENABLED = 0 GOOS = darwin go build -trimpath -o build/binary-bundle/darwin/fleetctl -ldflags ${ LDFLAGS_VERSION } ./cmd/fleetctl
CGO_ENABLED = 0 GOOS = windows go build -trimpath -o build/binary-bundle/windows/fleetctl.exe -ldflags ${ LDFLAGS_VERSION } ./cmd/fleetctl
2018-05-23 19:19:01 +00:00
binary-bundle : xp -fleet xp -fleetctl
2020-11-13 02:03:01 +00:00
cd build/binary-bundle && zip -r fleet.zip darwin/ linux/ windows/
2021-03-31 12:33:00 +00:00
cd build/binary-bundle && mkdir fleetctl-macos && cp darwin/fleetctl fleetctl-macos && tar -czf fleetctl-macos.tar.gz fleetctl-macos
cd build/binary-bundle && mkdir fleetctl-linux && cp linux/fleetctl fleetctl-linux && tar -czf fleetctl-linux.tar.gz fleetctl-linux
2020-12-02 16:24:34 +00:00
cd build/binary-bundle && mkdir fleetctl-windows && cp windows/fleetctl.exe fleetctl-windows && tar -czf fleetctl-windows.tar.gz fleetctl-windows
2021-03-31 12:33:00 +00:00
cd build/binary-bundle && cp windows/fleetctl.exe . && zip fleetctl.exe.zip fleetctl.exe
2020-12-02 16:24:34 +00:00
cd build/binary-bundle && shasum -a 256 fleet.zip fleetctl.exe.zip fleetctl-macos.tar.gz fleetctl-windows.tar.gz fleetctl-linux.tar.gz
2020-11-13 02:03:01 +00:00
2023-03-31 14:39:13 +00:00
# Build orbit/fleetd fleetd_tables extension
fleetd-tables-windows :
2023-05-26 20:25:32 +00:00
GOOS = windows GOARCH = amd64 go build -o fleetd_tables_windows.exe ./orbit/cmd/fleetd_tables
2025-04-11 14:18:28 +00:00
fleetd-tables-windows-arm64 :
GOOS = windows GOARCH = arm64 go build -o fleetd_tables_windows_arm64.exe ./orbit/cmd/fleetd_tables
2023-03-31 14:39:13 +00:00
fleetd-tables-linux :
GOOS = linux GOARCH = amd64 go build -o fleetd_tables_linux.ext ./orbit/cmd/fleetd_tables
2024-07-17 20:07:59 +00:00
fleetd-tables-linux-arm64 :
GOOS = linux GOARCH = arm64 go build -o fleetd_tables_linux_arm64.ext ./orbit/cmd/fleetd_tables
2023-03-31 14:39:13 +00:00
fleetd-tables-darwin :
GOOS = darwin GOARCH = amd64 go build -o fleetd_tables_darwin.ext ./orbit/cmd/fleetd_tables
2024-11-15 22:05:07 +00:00
fleetd-tables-darwin_arm64 :
GOOS = darwin GOARCH = arm64 CGO_ENABLED = 1 go build -o fleetd_tables_darwin_arm64.ext ./orbit/cmd/fleetd_tables
fleetd-tables-darwin-universal : fleetd -tables -darwin fleetd -tables -darwin_arm 64
lipo -create fleetd_tables_darwin.ext fleetd_tables_darwin_arm64.ext -output fleetd_tables_darwin_universal.ext
2025-04-11 14:18:28 +00:00
fleetd-tables-all : fleetd -tables -windows fleetd -tables -linux fleetd -tables -darwin -universal fleetd -tables -linux -arm 64 fleetd -tables -windows -arm 64
2023-11-02 02:11:35 +00:00
fleetd-tables-clean :
2024-11-15 22:05:07 +00:00
rm -f fleetd_tables_windows.exe fleetd_tables_linux.ext fleetd_tables_linux_arm64.ext fleetd_tables_darwin.ext fleetd_tables_darwin_arm64.ext fleetd_tables_darwin_universal.ext
2021-06-25 21:56:01 +00:00
.pre-binary-arch :
i f n d e f G O O S
@echo "GOOS is Empty. Try use to see valid GOOS/GOARCH platform: go tool dist list. Ex.: make binary-arch GOOS=linux GOARCH=arm64"
@exit 1;
e n d i f
i f n d e f G O A R C H
@echo "GOARCH is Empty. Try use to see valid GOOS/GOARCH platform: go tool dist list. Ex.: make binary-arch GOOS=linux GOARCH=arm64"
@exit 1;
e n d i f
binary-arch : .pre -binary -arch .pre -binary -bundle .pre -fleet
mkdir -p build/binary-bundle/${ GOARCH } -${ GOOS }
2024-01-02 21:22:52 +00:00
CGO_ENABLED = 1 GOARCH = ${ GOARCH } GOOS = ${ GOOS } go build -tags full,fts5,netgo -o build/binary-bundle/${ GOARCH } -${ GOOS } /fleet -ldflags ${ LDFLAGS_VERSION } ./cmd/fleet
CGO_ENABLED = 0 GOARCH = ${ GOARCH } GOOS = ${ GOOS } go build -tags full,fts5,netgo -o build/binary-bundle/${ GOARCH } -${ GOOS } /fleetctl -ldflags ${ LDFLAGS_VERSION } ./cmd/fleetctl
2021-06-25 21:56:01 +00:00
cd build/binary-bundle/${ GOARCH } -${ GOOS } && tar -czf fleetctl-${ GOARCH } -${ GOOS } .tar.gz fleetctl fleet
2021-03-11 23:55:58 +00:00
# Drop, create, and migrate the e2e test database
e2e-reset-db :
2024-08-02 21:12:36 +00:00
docker compose exec -T mysql_test bash -c 'echo "drop database if exists e2e; create database e2e;" | MYSQL_PWD=toor mysql -uroot'
2025-08-12 13:45:43 +00:00
./build/fleet prepare db --mysql_address= localhost:$$ { FLEET_MYSQL_TEST_PORT:-3307} --mysql_username= root --mysql_password= toor --mysql_database= e2e
2021-03-11 23:55:58 +00:00
e2e-setup :
2021-06-09 18:56:59 +00:00
./build/fleetctl config set --context e2e --address https://localhost:8642 --tls-skip-verify true
2022-05-18 17:03:00 +00:00
./build/fleetctl setup --context e2e --email= admin@example.com --password= password123# --org-name= 'Fleet Test' --name Admin
./build/fleetctl user create --context e2e --email= maintainer@example.com --name maintainer --password= password123# --global-role= maintainer
./build/fleetctl user create --context e2e --email= observer@example.com --name observer --password= password123# --global-role= observer
2021-06-24 20:42:29 +00:00
./build/fleetctl user create --context e2e --email= sso_user@example.com --name "SSO user" --sso= true
2021-03-11 23:55:58 +00:00
2022-06-23 15:01:37 +00:00
# Setup e2e test environment and pre-populate database with software and vulnerabilities fixtures.
#
# Use in lieu of `e2e-setup` for tests that depend on these fixtures
e2e-setup-with-software :
curl 'https://localhost:8642/api/v1/setup' \
--data-raw '{"server_url":"https://localhost:8642","org_info":{"org_name":"Fleet Test"},"admin":{"admin":true,"email":"admin@example.com","name":"Admin","password":"password123#","password_confirmation":"password123#"}}' \
--compressed \
--insecure
./tools/backup_db/restore_e2e_software_test.sh
2021-12-24 20:18:00 +00:00
e2e-serve-free : e 2e -reset -db
2025-08-12 13:45:43 +00:00
./build/fleet serve --mysql_address= localhost:$$ { FLEET_MYSQL_TEST_PORT:-3307} --mysql_username= root --mysql_password= toor --mysql_database= e2e --server_address= 0.0.0.0:8642
2021-06-01 00:07:51 +00:00
2021-12-24 20:18:00 +00:00
e2e-serve-premium : e 2e -reset -db
2025-08-12 13:45:43 +00:00
./build/fleet serve --dev_license --mysql_address= localhost:$$ { FLEET_MYSQL_TEST_PORT:-3307} --mysql_username= root --mysql_password= toor --mysql_database= e2e --server_address= 0.0.0.0:8642
2021-06-01 00:07:51 +00:00
2022-06-23 15:01:37 +00:00
# Associate a host with a Fleet Desktop token.
#
# Usage:
# make e2e-set-desktop-token host_id=1 token=foo
e2e-set-desktop-token :
2024-08-02 21:12:36 +00:00
docker compose exec -T mysql_test bash -c 'echo "INSERT INTO e2e.host_device_auth (host_id, token) VALUES ($(host_id), \"$(token)\") ON DUPLICATE KEY UPDATE token=VALUES(token)" | MYSQL_PWD=toor mysql -uroot'
2022-06-23 15:01:37 +00:00
2021-08-25 22:14:24 +00:00
changelog :
2025-05-27 20:17:47 +00:00
find changes -type f ! -name .keep -exec awk 'NF' { } + > new-CHANGELOG.md
2021-08-25 22:14:24 +00:00
sh -c "cat new-CHANGELOG.md CHANGELOG.md > tmp-CHANGELOG.md && rm new-CHANGELOG.md && mv tmp-CHANGELOG.md CHANGELOG.md"
sh -c "git rm changes/*"
2021-10-22 18:26:54 +00:00
2021-12-20 01:38:10 +00:00
changelog-orbit :
2024-04-09 21:37:55 +00:00
$( eval TODAY_DATE := $( shell date "+%b %d, %Y" ) )
@echo -e " ## Orbit $( version) ( $( TODAY_DATE) )\n " > new-CHANGELOG.md
sh -c "find orbit/changes -type file | grep -v .keep | xargs -I {} sh -c 'grep \"\S\" {} | sed -E " s/^-/*/"; echo' >> new-CHANGELOG.md"
2021-12-20 01:38:10 +00:00
sh -c "cat new-CHANGELOG.md orbit/CHANGELOG.md > tmp-CHANGELOG.md && rm new-CHANGELOG.md && mv tmp-CHANGELOG.md orbit/CHANGELOG.md"
sh -c "git rm orbit/changes/*"
2024-04-15 13:09:40 +00:00
changelog-chrome :
2024-04-29 15:55:37 +00:00
$( eval TODAY_DATE := $( shell date "+%b %d, %Y" ) )
@echo -e " ## fleetd-chrome $( version) ( $( TODAY_DATE) )\n " > new-CHANGELOG.md
sh -c "find ee/fleetd-chrome/changes -type file | grep -v .keep | xargs -I {} sh -c 'grep \"\S\" {}; echo' >> new-CHANGELOG.md"
2024-04-15 13:09:40 +00:00
sh -c "cat new-CHANGELOG.md ee/fleetd-chrome/CHANGELOG.md > tmp-CHANGELOG.md && rm new-CHANGELOG.md && mv tmp-CHANGELOG.md ee/fleetd-chrome/CHANGELOG.md"
sh -c "git rm ee/fleetd-chrome/changes/*"
2026-04-03 14:00:39 +00:00
changelog-android :
$( eval TODAY_DATE := $( shell date "+%b %d, %Y" ) )
@echo -e " ## Android agent $( version) ( $( TODAY_DATE) )\n " > new-CHANGELOG.md
sh -c "find android/changes -type f ! -name .keep -exec awk 'NF' {} + | sed -E 's/^-/*/' >> new-CHANGELOG.md"
@echo "" >> new-CHANGELOG.md
sh -c "cat new-CHANGELOG.md android/CHANGELOG.md > tmp-CHANGELOG.md && rm new-CHANGELOG.md && mv tmp-CHANGELOG.md android/CHANGELOG.md"
sh -c "find android/changes -type f ! -name .keep -exec git rm {} +"
2025-02-07 11:30:07 +00:00
# Updates the documentation for the currently released versions of fleetd components in old Fleet's TUF (tuf.fleetctl.com).
fleetd-old-tuf :
sh -c 'echo "<!-- DO NOT EDIT. This document is automatically generated by running \`make fleetd-old-tuf\`. -->\n# tuf.fleetctl.com\n\nFollowing are the currently deployed versions of fleetd components on the \`stable\` and \`edge\` channel.\n" > orbit/old-TUF.md'
sh -c 'echo "## \`stable\`\n" >> orbit/old-TUF.md'
2025-02-18 13:34:52 +00:00
sh -c 'go run tools/tuf/status/tuf-status.go channel-version -url https://tuf.fleetctl.com -channel stable -format markdown >> orbit/old-TUF.md'
2025-02-07 11:30:07 +00:00
sh -c 'echo "\n## \`edge\`\n" >> orbit/old-TUF.md'
2025-02-18 13:34:52 +00:00
sh -c 'go run tools/tuf/status/tuf-status.go channel-version -url https://tuf.fleetctl.com -channel edge -format markdown >> orbit/old-TUF.md'
2025-02-07 11:30:07 +00:00
# Updates the documentation for the currently released versions of fleetd components in Fleet's TUF (updates.fleetdm.com).
2024-02-15 18:30:29 +00:00
fleetd-tuf :
2025-02-07 11:30:07 +00:00
sh -c 'echo "<!-- DO NOT EDIT. This document is automatically generated by running \`make fleetd-tuf\`. -->\n# updates.fleetdm.com\n\nFollowing are the currently deployed versions of fleetd components on the \`stable\` and \`edge\` channel.\n" > orbit/TUF.md'
2024-02-15 18:30:29 +00:00
sh -c 'echo "## \`stable\`\n" >> orbit/TUF.md'
sh -c 'go run tools/tuf/status/tuf-status.go channel-version -channel stable -format markdown >> orbit/TUF.md'
sh -c 'echo "\n## \`edge\`\n" >> orbit/TUF.md'
sh -c 'go run tools/tuf/status/tuf-status.go channel-version -channel edge -format markdown >> orbit/TUF.md'
2021-10-22 18:26:54 +00:00
###
# Development DB commands
###
# Reset the development DB
db-reset :
2024-08-02 21:12:36 +00:00
docker compose exec -T mysql bash -c 'echo "drop database if exists fleet; create database fleet;" | MYSQL_PWD=toor mysql -uroot'
2021-10-22 18:26:54 +00:00
./build/fleet prepare db --dev
# Back up the development DB to file
db-backup :
./tools/backup_db/backup.sh
# Restore the development DB from file
db-restore :
2021-10-27 23:17:41 +00:00
./tools/backup_db/restore.sh
2022-03-15 19:04:12 +00:00
2025-02-05 15:52:10 +00:00
# Interactive snapshot / restore
2025-04-07 14:10:15 +00:00
.help-short--snap .help-short--snapshot :
@echo "Snapshot the database"
.help-long--snap .help-long--snapshot :
2025-04-07 17:52:26 +00:00
@echo " Interactively take a snapshot of the present database state. Restore snapshots with \` $( TOOL_CMD) restore\`. "
2025-04-07 14:10:15 +00:00
2025-02-05 15:52:10 +00:00
SNAPSHOT_BINARY = ./build/snapshot
2025-04-07 14:10:15 +00:00
snap snapshot : $( SNAPSHOT_BINARY )
2025-02-05 15:52:10 +00:00
@ $( SNAPSHOT_BINARY) snapshot
$(SNAPSHOT_BINARY) : tools /snapshot /*.go
cd tools/snapshot && go build -o ../../build/snapshot
2025-04-07 14:10:15 +00:00
.help-short--restore :
@echo "Restore a database snapshot"
.help-long--restore :
2025-04-07 17:52:26 +00:00
@echo " Interactively restore database state using a snapshot taken with \` $( TOOL_CMD) snapshot\`. "
2025-04-07 14:10:15 +00:00
.help-options--restore :
@echo "PREPARE (alias: PREP)"
@echo "Run migrations after restoring the snapshot"
2025-02-05 15:52:10 +00:00
restore : $( SNAPSHOT_BINARY )
2025-04-07 14:10:15 +00:00
@$( SNAPSHOT_BINARY) restore
@if [ [ " $( PREP) " = = "true" || " $( PREPARE) " = = "true" ] ] ; then \
echo "Running migrations..." ; \
./build/fleet prepare db --dev; \
fi
@echo Done!
2025-02-05 15:52:10 +00:00
2022-05-13 10:15:29 +00:00
# Generate osqueryd.app.tar.gz bundle from osquery.io.
2022-03-15 19:04:12 +00:00
#
# Usage:
2026-04-20 15:51:02 +00:00
# To generate an osquery bundle for a released version of osquery:
2022-03-15 19:04:12 +00:00
# make osqueryd-app-tar-gz version=5.1.0 out-path=.
2026-04-20 15:51:02 +00:00
#
# To generate an osquery bundle for a unreleased change in osquery in a pull request
# (e.g. https://github.com/osquery/osquery/pull/8815):
# make osqueryd-app-tar-gz pr=8815 out-path=.
2022-03-15 19:04:12 +00:00
osqueryd-app-tar-gz :
i f n e q ( $( shell uname ) , D a r w i n )
@echo "Makefile target osqueryd-app-tar-gz is only supported on macOS"
@exit 1
e n d i f
2026-04-20 15:51:02 +00:00
i f d e f p r
$( eval TMP_DIR := $( shell mktemp -d) )
@echo " Fetching macos_unsigned_tgz_universal artifact from osquery/osquery PR $( pr) ... "
@PR_SHA= $$ ( gh pr view -R osquery/osquery $( pr) --json headRefOid -q .headRefOid) && \
echo " PR head SHA: $$ PR_SHA " && \
RUN_IDS = $$ ( gh api " repos/osquery/osquery/actions/runs?head_sha= $$ PR_SHA " \
-q '[.workflow_runs[] | select(.conclusion == "success") | .id] | .[]' ) && \
if [ -z " $$ RUN_IDS " ] ; then \
echo " Error: no successful workflow runs found for PR $( pr) " ; \
rm -rf $( TMP_DIR) ; \
exit 1; \
fi && \
DOWNLOADED = false && \
for run_id in $$ RUN_IDS; do \
if gh run download -R osquery/osquery $$ run_id -n macos_unsigned_tgz_universal -D $( TMP_DIR) /artifact 2>/dev/null; then \
DOWNLOADED = true; \
echo " Downloaded artifact from run $$ run_id " ; \
break; \
fi ; \
done && \
if [ " $$ DOWNLOADED " != "true" ] ; then \
echo " Error: macos_unsigned_tgz_universal artifact not found in any successful run for PR $( pr) " ; \
rm -rf $( TMP_DIR) ; \
exit 1; \
fi
@INNER_TGZ= $$ ( find $( TMP_DIR) /artifact -name '*.tar.gz' -o -name '*.tgz' | head -1) && \
if [ -z " $$ INNER_TGZ " ] ; then \
echo "Error: no tarball found inside downloaded artifact" ; \
rm -rf $( TMP_DIR) ; \
exit 1; \
fi && \
mkdir -p $( TMP_DIR) /extracted && \
tar xf " $$ INNER_TGZ " -C $( TMP_DIR) /extracted
@OSQUERY_APP= $$ ( find $( TMP_DIR) /extracted -type d -name 'osquery.app' | head -1) && \
if [ -z " $$ OSQUERY_APP " ] ; then \
echo "Error: osquery.app not found in extracted artifact. Contents:" ; \
find $( TMP_DIR) /extracted -type f; \
rm -rf $( TMP_DIR) ; \
exit 1; \
fi && \
OSQUERY_APP_DIR = $$ ( dirname " $$ OSQUERY_APP " ) && \
" $$ OSQUERY_APP/Contents/MacOS/osqueryd " --version && \
tar czf $( out-path) /osqueryd.app.tar.gz -C " $$ OSQUERY_APP_DIR " osquery.app
rm -rf $( TMP_DIR)
e l s e
2022-03-15 19:04:12 +00:00
$( eval TMP_DIR := $( shell mktemp -d) )
2022-06-13 15:04:21 +00:00
curl -L https://github.com/osquery/osquery/releases/download/$( version) /osquery-$( version) .pkg --output $( TMP_DIR) /osquery-$( version) .pkg
2022-03-15 19:04:12 +00:00
pkgutil --expand $( TMP_DIR) /osquery-$( version) .pkg $( TMP_DIR) /osquery_pkg_expanded
rm -rf $( TMP_DIR) /osquery_pkg_payload_expanded
mkdir -p $( TMP_DIR) /osquery_pkg_payload_expanded
tar xf $( TMP_DIR) /osquery_pkg_expanded/Payload --directory $( TMP_DIR) /osquery_pkg_payload_expanded
2022-05-13 10:15:29 +00:00
$( TMP_DIR) /osquery_pkg_payload_expanded/opt/osquery/lib/osquery.app/Contents/MacOS/osqueryd --version
2022-03-15 19:04:12 +00:00
tar czf $( out-path) /osqueryd.app.tar.gz -C $( TMP_DIR) /osquery_pkg_payload_expanded/opt/osquery/lib osquery.app
rm -r $( TMP_DIR)
2026-04-20 15:51:02 +00:00
e n d i f
2022-03-21 17:53:53 +00:00
2023-02-10 20:03:43 +00:00
# Generate nudge.app.tar.gz bundle from nudge repo.
#
# Usage:
# make nudge-app-tar-gz version=1.1.10.81462 out-path=.
nudge-app-tar-gz :
i f n e q ( $( shell uname ) , D a r w i n )
@echo "Makefile target nudge-app-tar-gz is only supported on macOS"
@exit 1
e n d i f
$( eval TMP_DIR := $( shell mktemp -d) )
curl -L https://github.com/macadmins/nudge/releases/download/v$( version) /Nudge-$( version) .pkg --output $( TMP_DIR) /nudge-$( version) .pkg
pkgutil --expand $( TMP_DIR) /nudge-$( version) .pkg $( TMP_DIR) /nudge_pkg_expanded
mkdir -p $( TMP_DIR) /nudge_pkg_payload_expanded
tar xvf $( TMP_DIR) /nudge_pkg_expanded/nudge-$( version) .pkg/Payload --directory $( TMP_DIR) /nudge_pkg_payload_expanded
$( TMP_DIR) /nudge_pkg_payload_expanded/Nudge.app/Contents/MacOS/Nudge --version
tar czf $( out-path) /nudge.app.tar.gz -C $( TMP_DIR) /nudge_pkg_payload_expanded/ Nudge.app
rm -r $( TMP_DIR)
2023-05-11 18:01:43 +00:00
# Generate swiftDialog.app.tar.gz bundle from the swiftDialog repo.
#
# Usage:
2025-09-05 14:49:21 +00:00
# make swift-dialog-app-tar-gz version=2.5.6 build=4805 out-path=.
2023-05-11 18:01:43 +00:00
swift-dialog-app-tar-gz :
i f n e q ( $( shell uname ) , D a r w i n )
@echo "Makefile target swift-dialog-app-tar-gz is only supported on macOS"
@exit 1
2023-09-19 16:49:58 +00:00
e n d i f
2025-09-05 14:49:21 +00:00
# locking the version of swiftDialog to 2.5.6-4805 as newer versions
2024-04-09 21:37:55 +00:00
# might have layout issues.
2025-09-05 14:49:21 +00:00
i f n e q ( $( version ) , 2 . 5 . 6 )
@echo "Version is locked at 2.5.6, see comments in Makefile target for details"
2023-09-19 16:49:58 +00:00
@exit 1
e n d i f
2025-09-05 14:49:21 +00:00
i f n e q ( $( build ) , 4 8 0 5 )
@echo "Build version is locked at 4805, see comments in Makefile target for details"
2023-09-19 16:49:58 +00:00
@exit 1
2023-05-11 18:01:43 +00:00
e n d i f
$( eval TMP_DIR := $( shell mktemp -d) )
2023-09-19 16:49:58 +00:00
curl -L https://github.com/swiftDialog/swiftDialog/releases/download/v$( version) /dialog-$( version) -$( build) .pkg --output $( TMP_DIR) /swiftDialog-$( version) .pkg
2023-05-11 18:01:43 +00:00
pkgutil --expand $( TMP_DIR) /swiftDialog-$( version) .pkg $( TMP_DIR) /swiftDialog_pkg_expanded
mkdir -p $( TMP_DIR) /swiftDialog_pkg_payload_expanded
2023-09-19 16:49:58 +00:00
tar xvf $( TMP_DIR) /swiftDialog_pkg_expanded/tmp-package.pkg/Payload --directory $( TMP_DIR) /swiftDialog_pkg_payload_expanded
2025-09-05 14:49:21 +00:00
# Remove xattrs which are included in the .pkg(erroneously?) in some versions
xattr -cr $( TMP_DIR) /swiftDialog_pkg_payload_expanded
2023-05-18 17:21:54 +00:00
$( TMP_DIR) /swiftDialog_pkg_payload_expanded/Library/Application\ Support/Dialog/Dialog.app/Contents/MacOS/Dialog --version
tar czf $( out-path) /swiftDialog.app.tar.gz -C $( TMP_DIR) /swiftDialog_pkg_payload_expanded/Library/Application\ Support/Dialog/ Dialog.app
2023-05-11 18:01:43 +00:00
rm -rf $( TMP_DIR)
2024-07-31 19:59:30 +00:00
# Generate escrowBuddy.pkg bundle from the Escrow Buddy repo.
#
# Usage:
# make escrow-buddy-pkg version=1.0.0 out-path=.
escrow-buddy-pkg :
curl -L https://github.com/macadmins/escrow-buddy/releases/download/v$( version) /Escrow.Buddy-$( version) .pkg --output $( out-path) /escrowBuddy.pkg
2022-03-21 17:53:53 +00:00
# Build and generate desktop.app.tar.gz bundle.
#
# Usage:
# FLEET_DESKTOP_APPLE_AUTHORITY=foo FLEET_DESKTOP_VERSION=0.0.1 make desktop-app-tar-gz
2022-05-04 14:14:12 +00:00
#
# Output: desktop.app.tar.gz
2022-03-21 17:53:53 +00:00
desktop-app-tar-gz :
i f n e q ( $( shell uname ) , D a r w i n )
@echo "Makefile target desktop-app-tar-gz is only supported on macOS"
@exit 1
e n d i f
go run ./tools/desktop macos
2022-04-01 20:28:51 +00:00
2022-05-04 14:14:12 +00:00
FLEET_DESKTOP_VERSION ?= unknown
2022-04-01 20:28:51 +00:00
# Build desktop executable for Windows.
2023-05-17 21:53:25 +00:00
# This generates desktop executable for Windows that includes versioninfo binary properties
# These properties can be displayed when right-click on the binary in Windows Explorer.
# See: https://docs.microsoft.com/en-us/windows/win32/menurc/versioninfo-resource
# To sign this binary with a certificate, use signtool.exe or osslsigncode tool
2022-04-01 20:28:51 +00:00
#
# Usage:
# FLEET_DESKTOP_VERSION=0.0.1 make desktop-windows
2022-05-04 14:14:12 +00:00
#
# Output: fleet-desktop.exe
2022-04-01 20:28:51 +00:00
desktop-windows :
2023-05-17 21:53:25 +00:00
go run ./orbit/tools/build/build-windows.go -version $( FLEET_DESKTOP_VERSION) -input ./orbit/cmd/desktop -output fleet-desktop.exe
2022-05-04 14:14:12 +00:00
2025-04-11 14:18:28 +00:00
# Build desktop executable for Windows.
# This generates desktop executable for Windows that includes versioninfo binary properties
# These properties can be displayed when right-click on the binary in Windows Explorer.
# See: https://docs.microsoft.com/en-us/windows/win32/menurc/versioninfo-resource
# To sign this binary with a certificate, use signtool.exe or osslsigncode tool
#
# Usage:
# FLEET_DESKTOP_VERSION=0.0.1 make desktop-windows-arm64
#
# Output: fleet-desktop.exe
desktop-windows-arm64 :
go run ./orbit/tools/build/build-windows.go -version $( FLEET_DESKTOP_VERSION) -input ./orbit/cmd/desktop -output fleet-desktop.exe -arch arm64
2022-05-04 14:14:12 +00:00
# Build desktop executable for Linux.
#
# Usage:
# FLEET_DESKTOP_VERSION=0.0.1 make desktop-linux
#
# Output: desktop.tar.gz
desktop-linux :
docker build -f Dockerfile-desktop-linux -t desktop-linux-builder .
docker run --rm -v $( shell pwd ) :/output desktop-linux-builder /bin/bash -c " \
2024-10-31 14:59:04 +00:00
mkdir -p /output/fleet-desktop && \
2026-04-08 21:30:05 +00:00
CGO_ENABLED = 1 CC = musl-gcc go build -o /output/fleet-desktop/fleet-desktop -ldflags \" -s -w -linkmode external -extldflags \\ \" -static\\ \" -X= main.version= $( FLEET_DESKTOP_VERSION) \" /usr/src/fleet/orbit/cmd/desktop && \
2024-07-17 20:07:59 +00:00
cd /output && \
tar czf desktop.tar.gz fleet-desktop && \
rm -r fleet-desktop"
# Build desktop executable for Linux ARM.
#
# Usage:
# FLEET_DESKTOP_VERSION=0.0.1 make desktop-linux-arm64
#
# Output: desktop.tar.gz
desktop-linux-arm64 :
docker build -f Dockerfile-desktop-linux -t desktop-linux-builder .
docker run --rm -v $( shell pwd ) :/output desktop-linux-builder /bin/bash -c " \
2024-10-31 14:59:04 +00:00
mkdir -p /output/fleet-desktop && \
2026-04-08 21:30:05 +00:00
GOARCH = arm64 go build -o /output/fleet-desktop/fleet-desktop -ldflags \" -s -w -X= main.version= $( FLEET_DESKTOP_VERSION) \" /usr/src/fleet/orbit/cmd/desktop && \
2023-11-02 19:40:21 +00:00
cd /output && \
2022-05-04 14:14:12 +00:00
tar czf desktop.tar.gz fleet-desktop && \
rm -r fleet-desktop"
Add read replica testing helpers and fix non-sso login bug (#4908)
not set on the INSERT.
- OUT: Only sets the ID on the passed session and returns it. (`CreatedAt`, `AccessedAt`, are not set.)
New version:
```go
func (ds *Datastore) NewSession(ctx context.Context, userID uint, sessionKey string) (*fleet.Session, error) {
sqlStatement := `
INSERT INTO sessions (
user_id,
` + "`key`" + `
)
VALUES(?,?)
`
result, err := ds.writer.ExecContext(ctx, sqlStatement, userID, sessionKey)
if err != nil {
return nil, ctxerr.Wrap(ctx, err, "inserting session")
}
id, _ := result.LastInsertId() // cannot fail with the mysql driver
return ds.sessionByID(ctx, ds.writer, uint(id))
}
```
- IN: Define arguments that are truly used when creating a session.
- OUT: Load and return the fleet.Session struct with all values set (using the `ds.writer` to support read replicas correctly).
PS: The new `NewSession` version mimics what we already do with other entities, like policies (`Datastore.NewGlobalPolicy`).
2022-04-04 23:52:05 +00:00
2023-05-17 21:53:25 +00:00
# Build orbit executable for Windows.
# This generates orbit executable for Windows that includes versioninfo binary properties
# These properties can be displayed when right-click on the binary in Windows Explorer.
# See: https://docs.microsoft.com/en-us/windows/win32/menurc/versioninfo-resource
# To sign this binary with a certificate, use signtool.exe or osslsigncode tool
#
# Usage:
# ORBIT_VERSION=0.0.1 make orbit-windows
#
# Output: orbit.exe
orbit-windows :
go run ./orbit/tools/build/build-windows.go -version $( ORBIT_VERSION) -input ./orbit/cmd/orbit -output orbit.exe
2025-04-11 14:18:28 +00:00
# Build orbit executable for Windows.
# This generates orbit executable for Windows that includes versioninfo binary properties
# These properties can be displayed when right-click on the binary in Windows Explorer.
# See: https://docs.microsoft.com/en-us/windows/win32/menurc/versioninfo-resource
# To sign this binary with a certificate, use signtool.exe or osslsigncode tool
#
# Usage:
# ORBIT_VERSION=0.0.1 make orbit-windows-arm64
#
# Output: orbit.exe
orbit-windows-arm64 :
go run ./orbit/tools/build/build-windows.go -version $( ORBIT_VERSION) -input ./orbit/cmd/orbit -output orbit.exe -arch arm64
Add read replica testing helpers and fix non-sso login bug (#4908)
not set on the INSERT.
- OUT: Only sets the ID on the passed session and returns it. (`CreatedAt`, `AccessedAt`, are not set.)
New version:
```go
func (ds *Datastore) NewSession(ctx context.Context, userID uint, sessionKey string) (*fleet.Session, error) {
sqlStatement := `
INSERT INTO sessions (
user_id,
` + "`key`" + `
)
VALUES(?,?)
`
result, err := ds.writer.ExecContext(ctx, sqlStatement, userID, sessionKey)
if err != nil {
return nil, ctxerr.Wrap(ctx, err, "inserting session")
}
id, _ := result.LastInsertId() // cannot fail with the mysql driver
return ds.sessionByID(ctx, ds.writer, uint(id))
}
```
- IN: Define arguments that are truly used when creating a session.
- OUT: Load and return the fleet.Session struct with all values set (using the `ds.writer` to support read replicas correctly).
PS: The new `NewSession` version mimics what we already do with other entities, like policies (`Datastore.NewGlobalPolicy`).
2022-04-04 23:52:05 +00:00
# db-replica-setup setups one main and one read replica MySQL instance for dev/testing.
# - Assumes the docker containers are already running (tools/mysql-replica-testing/docker-compose.yml)
# - MySQL instance listening on 3308 is the main instance.
# - MySQL instance listening on 3309 is the read instance.
# - Sets a delay of 1s for replication.
db-replica-setup :
$( eval MYSQL_REPLICATION_USER := replicator)
$( eval MYSQL_REPLICATION_PASSWORD := rotacilper)
MYSQL_PWD = toor mysql --host 127.0.0.1 --port 3309 -uroot -AN -e "stop slave; reset slave all;"
2025-12-08 22:07:04 +00:00
MYSQL_PWD = toor mysql --host 127.0.0.1 --port 3308 -uroot -AN -e " drop user if exists ' $( MYSQL_REPLICATION_USER) '; create user ' $( MYSQL_REPLICATION_USER) '@'%' identified with mysql_native_password by ' $( MYSQL_REPLICATION_PASSWORD) '; grant replication slave on *.* to ' $( MYSQL_REPLICATION_USER) '@'%'; flush privileges; "
$( eval MAIN_POSITION := $( shell MYSQL_PWD = toor mysql --host 127.0.0.1 --port 3308 -uroot --vertical -e 'show master status' | grep Position | grep -o '[0-9]*' ) )
$( eval MAIN_FILE := $( shell MYSQL_PWD = toor mysql --host 127.0.0.1 --port 3308 -uroot --vertical -e 'show master status' | grep File | sed -n -e 's/^.*: //p' ) )
2024-05-14 20:06:23 +00:00
MYSQL_PWD = toor mysql --host 127.0.0.1 --port 3309 -uroot -AN -e " change master to master_port=3306,master_host='mysql_main',master_user=' $( MYSQL_REPLICATION_USER) ',master_password=' $( MYSQL_REPLICATION_PASSWORD) ',master_log_file=' $( MAIN_FILE) ',master_log_pos= $( MAIN_POSITION) ; "
if [ " ${ FLEET_MYSQL_IMAGE } " = = "mysql:8.0" ] ; then MYSQL_PWD = toor mysql --host 127.0.0.1 --port 3309 -uroot -AN -e "change master to get_master_public_key=1;" ; fi
Add read replica testing helpers and fix non-sso login bug (#4908)
not set on the INSERT.
- OUT: Only sets the ID on the passed session and returns it. (`CreatedAt`, `AccessedAt`, are not set.)
New version:
```go
func (ds *Datastore) NewSession(ctx context.Context, userID uint, sessionKey string) (*fleet.Session, error) {
sqlStatement := `
INSERT INTO sessions (
user_id,
` + "`key`" + `
)
VALUES(?,?)
`
result, err := ds.writer.ExecContext(ctx, sqlStatement, userID, sessionKey)
if err != nil {
return nil, ctxerr.Wrap(ctx, err, "inserting session")
}
id, _ := result.LastInsertId() // cannot fail with the mysql driver
return ds.sessionByID(ctx, ds.writer, uint(id))
}
```
- IN: Define arguments that are truly used when creating a session.
- OUT: Load and return the fleet.Session struct with all values set (using the `ds.writer` to support read replicas correctly).
PS: The new `NewSession` version mimics what we already do with other entities, like policies (`Datastore.NewGlobalPolicy`).
2022-04-04 23:52:05 +00:00
MYSQL_PWD = toor mysql --host 127.0.0.1 --port 3309 -uroot -AN -e "change master to master_delay=1;"
MYSQL_PWD = toor mysql --host 127.0.0.1 --port 3309 -uroot -AN -e "start slave;"
# db-replica-reset resets the main MySQL instance.
db-replica-reset : fleet
MYSQL_PWD = toor mysql --host 127.0.0.1 --port 3308 -uroot -e "drop database if exists fleet; create database fleet;"
FLEET_MYSQL_ADDRESS = 127.0.0.1:3308 ./build/fleet prepare db --dev
# db-replica-run runs fleet serve with one main and one read MySQL instance.
db-replica-run : fleet
2023-01-31 14:46:01 +00:00
FLEET_MYSQL_ADDRESS = 127.0.0.1:3308 FLEET_MYSQL_READ_REPLICA_ADDRESS = 127.0.0.1:3309 FLEET_MYSQL_READ_REPLICA_USERNAME = fleet FLEET_MYSQL_READ_REPLICA_DATABASE = fleet FLEET_MYSQL_READ_REPLICA_PASSWORD = insecure ./build/fleet serve --dev --dev_license
2025-02-28 13:42:32 +00:00
2025-04-16 14:50:10 +00:00
vex-report :
2025-05-16 00:15:37 +00:00
sh -c 'echo "<!-- DO NOT EDIT. This document is automatically generated by running \`make vex-report\`. -->\n# Vulnerability Report\n\nFollowing is the vulnerability report of Fleet and its dependencies.\n" > security/status.md'
2025-04-16 14:50:10 +00:00
sh -c 'echo "## \`fleetdm/fleet\` docker image\n" >> security/status.md'
sh -c 'go run ./tools/vex-parser ./security/vex/fleet >> security/status.md'
sh -c 'echo "## \`fleetdm/fleetctl\` docker image\n" >> security/status.md'
sh -c 'go run ./tools/vex-parser ./security/vex/fleetctl >> security/status.md'
2025-10-01 22:37:22 +00:00
sh -c 'echo "## \`fleetdm/wix\` docker image\n" >> security/status.md'
sh -c 'go run ./tools/vex-parser ./security/vex/wix >> security/status.md'
sh -c 'echo "## \`fleetdm/bomutils\` docker image\n" >> security/status.md'
sh -c 'go run ./tools/vex-parser ./security/vex/bomutils >> security/status.md'
2025-04-16 14:50:10 +00:00
2025-06-13 18:08:14 +00:00
# make update-go version=1.24.4
UPDATE_GO_DOCKERFILES := ./Dockerfile-desktop-linux ./infrastructure/loadtesting/terraform/docker/loadtest.Dockerfile ./tools/mdm/migration/mdmproxy/Dockerfile
2026-04-20 16:40:57 +00:00
UPDATE_GO_MODS := \
go.mod \
./tools/mdm/windows/bitlocker/go.mod \
./tools/snapshot/go.mod \
./tools/terraform/go.mod \
./third_party/vuln-check/go.mod \
./tools/ci/setboolcheck/go.mod \
./tools/github-manage/go.mod \
./tools/qacheck/go.mod \
./third_party/goval-dictionary/go.mod \
./tools/fleet-mcp/go.mod
2025-06-13 18:08:14 +00:00
update-go :
@test $( version) || ( echo "Mising 'version' argument, usage: 'make update-go version=1.24.4'" ; exit 1)
@for dockerfile in $( UPDATE_GO_DOCKERFILES) ; do \
go run ./tools/tuf/replace $$ dockerfile "golang:.+-" " golang: $( version) - " ; \
echo " Please update sha256 in $$ dockerfile " ; \
done
@for gomod in $( UPDATE_GO_MODS) ; do \
go run ./tools/tuf/replace $$ gomod " (?m)^go .+ $$ " " go $( version) " ; \
done
@echo " * Updated go to $( version) " > changes/update-go-$( version)
@cp changes/update-go-$( version) orbit/changes/update-go-$( version)
2025-04-11 14:18:28 +00:00
i n c l u d e . / t o o l s / m a k e f i l e - s u p p o r t / h e l p s y s t e m - t a r g e t s