2019-10-22 22:03:22 +08:00
## This is a self-documented Makefile. For usage information, run `make help`:
##
## For more information, refer to https://suva.sh/posts/well-documented-makefiles/
2021-08-25 21:11:22 +08:00
WIRE_TAGS = "oss"
2018-05-07 18:32:18 +08:00
- i n c l u d e l o c a l / M a k e f i l e
2021-08-25 21:11:22 +08:00
i n c l u d e . b i n g o / V a r i a b l e s . m k
2025-05-21 17:22:24 +08:00
i n c l u d e . c i t o o l s / V a r i a b l e s . m k
2018-05-07 18:32:18 +08:00
2021-06-29 16:01:21 +08:00
GO = go
2025-06-11 20:25:48 +08:00
GO_VERSION = 1.24.4
2024-08-09 22:05:02 +08:00
GO_LINT_FILES ?= $( shell ./scripts/go-workspace/golangci-lint-includes.sh)
2024-08-09 22:25:27 +08:00
GO_TEST_FILES ?= $( shell ./scripts/go-workspace/test-includes.sh)
2019-07-23 18:12:33 +08:00
SH_FILES ?= $( shell find ./scripts -name *.sh)
2024-06-04 22:02:09 +08:00
GO_RACE := $( shell [ -n " $( GO_RACE) " -o -e ".go-race-enabled-locally" ] && echo 1 )
2024-05-31 23:30:51 +08:00
GO_RACE_FLAG := $( if $( GO_RACE) ,-race)
2022-04-02 07:01:05 +08:00
GO_BUILD_FLAGS += $( if $( GO_BUILD_DEV) ,-dev)
GO_BUILD_FLAGS += $( if $( GO_BUILD_TAGS) ,-build-tags= $( GO_BUILD_TAGS) )
2024-05-31 23:30:51 +08:00
GO_BUILD_FLAGS += $( GO_RACE_FLAG)
2025-03-17 17:47:27 +08:00
GO_TEST_FLAGS += $( if $( GO_BUILD_TAGS) ,-tags= $( GO_BUILD_TAGS) )
2024-10-10 04:32:23 +08:00
GIT_BASE = remotes/origin/main
2019-03-28 00:53:49 +08:00
2024-10-08 20:47:33 +08:00
# GNU xargs has flag -r, and BSD xargs (e.g. MacOS) has that behaviour by default
XARGSR = $( shell xargs --version 2>& 1 | grep -q GNU && echo xargs -r || echo xargs)
2025-05-13 19:08:19 +08:00
# Test sharding to replicate CI behaviour locally.
SHARD ?= 1
SHARDS ?= 1
2023-02-08 09:34:05 +08:00
2025-05-13 19:08:19 +08:00
targets := $( shell echo '$(sources)' | tr "," " " )
2023-04-18 00:33:43 +08:00
2024-04-01 23:09:17 +08:00
.PHONY : all
2016-04-26 00:44:26 +08:00
all : deps build
2019-10-22 22:03:22 +08:00
##@ Dependencies
2024-04-01 23:09:17 +08:00
.PHONY : deps -go
2019-10-22 22:03:22 +08:00
deps-go : ## Install backend dependencies.
2024-05-31 23:30:51 +08:00
$( GO) run $( GO_RACE_FLAG) build.go setup
2016-10-11 14:51:44 +08:00
2024-04-01 23:09:17 +08:00
.PHONY : deps -js
2019-10-22 22:03:22 +08:00
deps-js : node_modules ## Install frontend dependencies.
2024-04-01 23:09:17 +08:00
.PHONY : deps
2019-10-22 22:03:22 +08:00
deps : deps -js ## Install all dependencies.
2024-04-01 23:09:17 +08:00
.PHONY : node_modules
2019-10-22 22:03:22 +08:00
node_modules : package .json yarn .lock ## Install node modules.
@echo "install frontend dependencies"
2021-10-08 22:19:10 +08:00
YARN_ENABLE_PROGRESS_BARS = false yarn install --immutable
2016-04-26 00:44:26 +08:00
2022-02-08 20:38:43 +08:00
##@ Swagger
SPEC_TARGET = public/api-spec.json
2023-09-26 03:34:57 +08:00
ENTERPRISE_SPEC_TARGET = public/api-enterprise-spec.json
MERGED_SPEC_TARGET = public/api-merged.json
2022-05-24 03:08:27 +08:00
NGALERT_SPEC_TARGET = pkg/services/ngalert/api/tooling/api.json
2022-02-08 20:38:43 +08:00
$(NGALERT_SPEC_TARGET) :
2022-05-24 03:08:27 +08:00
+$( MAKE) -C pkg/services/ngalert/api/tooling api.json
2022-02-08 20:38:43 +08:00
2025-03-20 17:09:00 +08:00
$(MERGED_SPEC_TARGET) : swagger -oss -gen swagger -enterprise -gen $( NGALERT_SPEC_TARGET ) ## Merge generated and ngalert API specs
2022-07-20 21:09:42 +08:00
# known conflicts DsPermissionType, AddApiKeyCommand, Json, Duration (identical models referenced by both specs)
2025-05-21 17:22:24 +08:00
GODEBUG = gotypesalias = 0 $( swagger) mixin -q $( SPEC_TARGET) $( ENTERPRISE_SPEC_TARGET) $( NGALERT_SPEC_TARGET) --ignore-conflicts -o $( MERGED_SPEC_TARGET)
2022-02-08 20:38:43 +08:00
2024-04-01 23:09:17 +08:00
.PHONY : swagger -oss -gen
2025-03-20 17:09:00 +08:00
swagger-oss-gen : ## Generate API Swagger specification
2023-09-26 03:34:57 +08:00
@echo "re-generating swagger for OSS"
rm -f $( SPEC_TARGET)
2025-05-21 17:22:24 +08:00
SWAGGER_GENERATE_EXTENSION = false GODEBUG = gotypesalias = 0 $( swagger) generate spec -q -m -w pkg/server -o $( SPEC_TARGET) \
2022-02-08 20:38:43 +08:00
-x "github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions" \
2024-06-13 17:41:35 +08:00
-x "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options" \
2022-02-08 20:38:43 +08:00
-x "github.com/prometheus/alertmanager" \
2022-10-14 21:51:05 +08:00
-i pkg/api/swagger_tags.json \
2023-09-26 03:34:57 +08:00
--exclude-tag= alpha \
--exclude-tag= enterprise
# this file only exists if enterprise is enabled
2024-04-01 23:09:17 +08:00
.PHONY : swagger -enterprise -gen
2023-09-26 03:34:57 +08:00
ENTERPRISE_EXT_FILE = pkg/extensions/ext.go
i f e q ( "$(wildcard $(ENTERPRISE_EXT_FILE))" , "" ) ## if enterprise is not enabled
swagger-enterprise-gen :
@echo "skipping re-generating swagger for enterprise: not enabled"
e l s e
2025-03-20 17:09:00 +08:00
swagger-enterprise-gen : ## Generate API Swagger specification
2023-09-26 03:34:57 +08:00
@echo "re-generating swagger for enterprise"
rm -f $( ENTERPRISE_SPEC_TARGET)
2025-05-21 17:22:24 +08:00
SWAGGER_GENERATE_EXTENSION = false GODEBUG = gotypesalias = 0 $( swagger) generate spec -q -m -w pkg/server -o $( ENTERPRISE_SPEC_TARGET) \
2023-09-26 03:34:57 +08:00
-x "github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions" \
2024-06-13 17:41:35 +08:00
-x "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options" \
2023-09-26 03:34:57 +08:00
-x "github.com/prometheus/alertmanager" \
-i pkg/api/swagger_tags.json \
2025-06-30 22:39:21 +08:00
-t enterprise \
2023-09-26 03:34:57 +08:00
--exclude-tag= alpha \
--include-tag= enterprise
e n d i f
2022-02-08 20:38:43 +08:00
2024-04-01 23:09:17 +08:00
.PHONY : swagger -gen
2023-09-26 03:34:57 +08:00
swagger-gen : gen -go $( MERGED_SPEC_TARGET ) swagger -validate
2022-02-08 20:38:43 +08:00
2024-04-01 23:09:17 +08:00
.PHONY : swagger -validate
2025-03-20 17:09:00 +08:00
swagger-validate : $( MERGED_SPEC_TARGET ) # Validate API spec
2025-05-21 17:22:24 +08:00
GODEBUG = gotypesalias = 0 $( swagger) validate --skip-warnings $( <)
2022-06-14 18:35:22 +08:00
2024-04-01 23:09:17 +08:00
.PHONY : swagger -clean
2023-09-26 03:34:57 +08:00
swagger-clean :
2023-01-31 19:00:45 +08:00
rm -f $( SPEC_TARGET) $( MERGED_SPEC_TARGET) $( OAPI_SPEC_TARGET)
2022-02-08 20:38:43 +08:00
2023-08-17 17:56:52 +08:00
.PHONY : cleanup -old -git -hooks
cleanup-old-git-hooks :
./scripts/cleanup-husky.sh
.PHONY : lefthook -install
2025-03-17 16:48:41 +08:00
lefthook-install : cleanup -old -git -hooks # install lefthook for pre-commit hooks
2025-05-21 17:22:24 +08:00
$( lefthook) install -f
2023-08-17 17:56:52 +08:00
.PHONY : lefthook -uninstall
2025-03-17 16:48:41 +08:00
lefthook-uninstall :
2025-05-21 17:22:24 +08:00
$( lefthook) uninstall
2023-08-17 17:56:52 +08:00
2022-08-05 00:51:12 +08:00
##@ OpenAPI 3
OAPI_SPEC_TARGET = public/openapi3.json
2024-04-01 23:09:17 +08:00
.PHONY : openapi 3-gen
2023-09-26 03:34:57 +08:00
openapi3-gen : swagger -gen ## Generates OpenApi 3 specs from the Swagger 2 already generated
2024-05-31 23:30:51 +08:00
$( GO) run $( GO_RACE_FLAG) scripts/openapi3/openapi3conv.go $( MERGED_SPEC_TARGET) $( OAPI_SPEC_TARGET)
2016-10-11 14:51:44 +08:00
2024-04-18 23:25:27 +08:00
##@ Internationalisation
.PHONY : i 18n -extract -enterprise
ENTERPRISE_FE_EXT_FILE = public/app/extensions/index.ts
i f e q ( "$(wildcard $(ENTERPRISE_FE_EXT_FILE))" , "" ) ## if enterprise is not enabled
i18n-extract-enterprise :
@echo "Skipping i18n extract for Enterprise: not enabled"
e l s e
2024-05-08 21:01:17 +08:00
i18n-extract-enterprise :
2024-04-18 23:25:27 +08:00
@echo "Extracting i18n strings for Enterprise"
yarn run i18next --config public/locales/i18next-parser-enterprise.config.cjs
e n d i f
.PHONY : i 18n -extract
i18n-extract : i 18n -extract -enterprise
@echo "Extracting i18n strings for OSS"
yarn run i18next --config public/locales/i18next-parser.config.cjs
2025-06-12 17:52:04 +08:00
@echo "Extracting i18n strings for packages"
yarn run packages:i18n-extract
2025-05-15 21:31:49 +08:00
@echo "Extracting i18n strings for plugins"
yarn run plugin:i18n-extract
2024-04-18 23:25:27 +08:00
2022-08-05 00:51:12 +08:00
##@ Building
2024-04-01 23:09:17 +08:00
.PHONY : gen -cue
2022-05-27 09:21:37 +08:00
gen-cue : ## Do all CUE/Thema code generation
@echo "generate code from .cue files"
Reconcile coremodels, entities, objects under new kind framework (#56492)
* Update thema to latest
* Deal with s/Library/*Runtime/
* Commit new, working results of codegen
* We like pointers now
* Always take runtime arg for NewBase()
* Sketchy handwavy pass at entity meta framework
* Little nibbles
* Update pkg/framework/coremodel/entityframework.cue
Co-authored-by: Artur Wierzbicki <wierzbicki.artur.94@gmail.com>
* Move file into new framework location
* Introduce loaders, Go code
* Complete rename to kind
* Flesh out framework, add svg/dashboard examples
* Cruft removal
* Remove generated kind go files from gitignore
* Refine maturity concept, add SlotKind
* Update embed and go deps
* Export PrefixWithGrafanaCUE
* Make the loader actually work, holy crap
* Many small tweaks to type.cue
* Add Apache 2 licensing exceptions for kinds
* Add new kinds dir, start of generator
* Roll back to earlier oapi-codegen
* Introduce new grafana-specific CUE loaders
* Introduce new tidy code generators framework
* Catch up kind framework with tinkering
* Add slices for the generators
* Add write/verify step to main generator
* Many renames
* Split up kind framework cue files
* Use kind.Decl within generated kinds
* Create kind.SomeDecl wrapper type to cache lineages
* Better names again
* Get one generated implemented, hopefully
* Copy dashboard schema into new kind.cue
* Small fixes to make the initial gen work
* Put svg kind in its new home
* Add generated Go dashboard type
* More renames and cleanups
* Add base kind registry and generator
* Stop blacklisting *_gen.go files
This is not the Go best practice, anyway. All we actually want to ignore
for enterprise is generated wire files.
* Change codegen output directories
pkg/kind -> pkg/kinds
pkg/registry/kindreg -> pkg/registry/corekind
* Rename pkg/framework/kind to pkg/kindsys
* Add core structured kind generator
* Add plural and machine names to kind spec
* Copy playlist over to kind system
* Consolidate kindsys files
* Add raw kind generator
* Update CODEOWNERS for kind framework
* Touch up comments a bit
* More docs tweaks
* Remove generated types to reduce noise for review
* Split each generator into its own file
* Rename Slot kind to Composable kind
* Add handwavy types for customkind loading
* Guard against init calls to framework loader
* First pass at doc on extending the kind system
* Improve attribute example in docs
* Fix wire imports
* Add basic TS types generator
* Fix composable kind category def
* No need for a separate file with generate directive
* Catch dashboard schema up
* Rename generator types to something saner and generic
* Make version configurable in ts/go generators
* Add CommonMeta to ease property access
* Add kindsys prop indicating whether lineage is group
* Put all kind categories back in a single file
* Finish with kindsys group props
* Refactor maturity progression per discussion
- Replace "committed" with "merged"
- All kindcats can use all maturity levels, at least for now
* Convert ts veneer index generator to modular system
* Move over to new jennywrites framework
* Strip down old coremodel generator
* Use public version of jennywrites
* Pull latest thema
* Commit generated Go types
* Add header injection postprocessor
* Move sdboyer/jennywrites to grafana/codejen
* Tweak header output
* Remove dashboard and playlist coremodels
* Fix up backend dashboards devenv test
* Fix TS import patterns to new gen filename
* Update internal imports, remove coremodel registry
* Fix compilation errors, wire generation
* Export and replace the prefix dropper
* More Go struct and field name changes
* Last name fixes, hopefully
* Fix lint errors
* Last lint error
Co-authored-by: Artur Wierzbicki <wierzbicki.artur.94@gmail.com>
2022-11-11 04:36:40 +08:00
go generate ./kinds/gen.go
2022-12-02 15:22:28 +08:00
go generate ./public/app/plugins/gen.go
2025-04-24 01:54:35 +08:00
@echo "// This file is managed by Grafana - DO NOT EDIT MANUALLY" > apps/dashboard/pkg/apis/dashboard/v1beta1/dashboard_kind.cue
@echo "// Source: kinds/dashboard/dashboard_kind.cue" >> apps/dashboard/pkg/apis/dashboard/v1beta1/dashboard_kind.cue
@echo "// To sync changes, run: make gen-cue" >> apps/dashboard/pkg/apis/dashboard/v1beta1/dashboard_kind.cue
@echo "" >> apps/dashboard/pkg/apis/dashboard/v1beta1/dashboard_kind.cue
@cat kinds/dashboard/dashboard_kind.cue >> apps/dashboard/pkg/apis/dashboard/v1beta1/dashboard_kind.cue
@cp apps/dashboard/pkg/apis/dashboard/v1beta1/dashboard_kind.cue apps/dashboard/pkg/apis/dashboard/v0alpha1/dashboard_kind.cue
2025-04-12 00:52:46 +08:00
2022-05-27 09:21:37 +08:00
2024-11-19 20:01:40 +08:00
.PHONY : gen -cuev 2
gen-cuev2 : ## Do all CUE code generation
@echo "generate code from .cue files (v2)"
2025-01-16 20:18:47 +08:00
@$( MAKE) -C ./kindsv2 all
2024-11-19 20:01:40 +08:00
2025-03-26 16:49:52 +08:00
# TODO (@radiohead): uncomment once we want to start generating code for all apps.
# For now, we want to use an explicit list of apps to generate code for.
#
# APPS_DIRS=$(shell find ./apps -mindepth 1 -maxdepth 1 -type d | sort)
2025-04-18 22:14:52 +08:00
APPS_DIRS := ./apps/dashboard ./apps/folder ./apps/alerting/notifications
2025-03-26 16:49:52 +08:00
.PHONY : gen -apps
gen-apps : ## Generate code for Grafana App SDK apps
for dir in $( APPS_DIRS) ; do \
$( MAKE) -C $$ dir generate; \
done
./hack/update-codegen.sh
2024-04-01 23:09:17 +08:00
.PHONY : gen -feature -toggles
2024-03-21 19:04:49 +08:00
gen-feature-toggles :
## First go test run fails because it will re-generate the feature toggles.
## Second go test run will compare the generated files and pass.
@echo "generate feature toggles"
go test -v ./pkg/services/featuremgmt/... > /dev/null 2>& 1; \
if [ $$ ? -eq 0 ] ; then \
echo "feature toggles already up-to-date" ; \
else \
go test -v ./pkg/services/featuremgmt/...; \
fi
2025-06-30 22:39:21 +08:00
.PHONY : gen -go gen -enterprise -go
i f e q ( "$(wildcard $(ENTERPRISE_EXT_FILE))" , "" ) ## if enterprise is not enabled
gen-enterprise-go :
@echo "skipping re-generating Wire graph for enterprise: not enabled"
e l s e
gen-enterprise-go : ## Generate Wire graph (Enterprise)
@echo "re-generating Wire graph for enterprise"
$( GO) run ./pkg/build/wire/cmd/wire/main.go gen -tags "enterprise" -gen_tags "(enterprise || pro)" -output_file_prefix= "enterprise_" ./pkg/server
e n d i f
gen-go : gen -enterprise -go ## Generate Wire graph
@echo "generatng Wire graph"
$( GO) run ./pkg/build/wire/cmd/wire/main.go gen -tags "oss" -gen_tags "(!enterprise && !pro)" ./pkg/server
2021-08-25 21:11:22 +08:00
2024-04-01 23:09:17 +08:00
.PHONY : fix -cue
2025-03-17 16:48:41 +08:00
fix-cue :
2023-01-24 09:36:46 +08:00
@echo "formatting cue files"
2025-05-21 17:22:24 +08:00
$( cue) fix kinds/**/*.cue
$( cue) fix public/app/plugins/**/**/*.cue
2023-01-24 09:36:46 +08:00
2024-04-01 23:09:17 +08:00
.PHONY : gen -jsonnet
2022-11-03 23:04:39 +08:00
gen-jsonnet :
2022-11-11 17:19:29 +08:00
go generate ./devenv/jsonnet
2022-11-03 23:04:39 +08:00
2024-07-04 00:49:03 +08:00
.PHONY : update -workspace
2024-10-16 00:27:27 +08:00
update-workspace : gen -go
2024-07-04 00:49:03 +08:00
@echo "updating workspace"
2024-08-09 04:51:17 +08:00
bash scripts/go-workspace/update-workspace.sh
2024-07-04 00:49:03 +08:00
2024-04-01 23:09:17 +08:00
.PHONY : build -go
2024-09-17 17:47:00 +08:00
build-go : gen -go update -workspace ## Build all Go binaries.
2024-10-15 21:40:51 +08:00
@echo "build go files with updated workspace"
$( GO) run build.go $( GO_BUILD_FLAGS) build
build-go-fast : gen -go ## Build all Go binaries.
2019-03-28 00:53:49 +08:00
@echo "build go files"
2022-04-02 07:01:05 +08:00
$( GO) run build.go $( GO_BUILD_FLAGS) build
2016-10-11 14:51:44 +08:00
2024-04-01 23:09:17 +08:00
.PHONY : build -backend
2022-11-23 00:53:43 +08:00
build-backend : ## Build Grafana backend.
@echo "build backend"
$( GO) run build.go $( GO_BUILD_FLAGS) build-backend
2024-04-01 23:09:17 +08:00
.PHONY : build -server
2019-10-22 22:03:22 +08:00
build-server : ## Build Grafana server.
2019-03-28 00:53:49 +08:00
@echo "build server"
2022-04-02 07:01:05 +08:00
$( GO) run build.go $( GO_BUILD_FLAGS) build-server
2018-03-07 06:59:45 +08:00
2024-04-01 23:09:17 +08:00
.PHONY : build -cli
2019-10-22 22:03:22 +08:00
build-cli : ## Build Grafana CLI application.
2021-08-17 18:06:33 +08:00
@echo "build grafana-cli"
2022-04-02 07:01:05 +08:00
$( GO) run build.go $( GO_BUILD_FLAGS) build-cli
2018-03-07 06:59:45 +08:00
2024-04-01 23:09:17 +08:00
.PHONY : build -js
2019-10-22 22:03:22 +08:00
build-js : ## Build frontend assets.
2019-03-28 00:53:49 +08:00
@echo "build frontend"
2018-03-07 06:59:45 +08:00
yarn run build
2016-04-26 00:44:26 +08:00
2023-10-23 16:44:38 +08:00
PLUGIN_ID ?=
2024-04-01 23:09:17 +08:00
.PHONY : build -plugin -go
2023-10-23 16:44:38 +08:00
build-plugin-go : ## Build decoupled plugins
@echo " build plugin $( PLUGIN_ID) "
@cd pkg/tsdb; \
if [ -z " $( PLUGIN_ID) " ] ; then \
echo "PLUGIN_ID is not set" ; \
exit 1; \
fi ; \
mage -v buildplugin $( PLUGIN_ID)
2024-04-01 23:09:17 +08:00
.PHONY : build
2019-10-22 22:03:22 +08:00
build : build -go build -js ## Build backend and frontend.
2016-10-11 14:51:44 +08:00
2024-04-01 23:09:17 +08:00
.PHONY : run
2025-03-17 16:48:41 +08:00
run : ## Build and run web server on filesystem changes. See /.bra.toml for configuration.
2025-05-21 17:22:24 +08:00
$( bra) run
2018-04-21 02:28:52 +08:00
2024-05-30 07:34:16 +08:00
.PHONY : run -go
run-go : ## Build and run web server immediately.
$( GO) run -race $( if $( GO_BUILD_TAGS) ,-build-tags= $( GO_BUILD_TAGS) ) \
2024-07-04 05:30:41 +08:00
./pkg/cmd/grafana -- server -profile -profile-addr= 127.0.0.1 -profile-port= 6000 -packaging= dev cfg:app_mode= development
2024-05-30 07:34:16 +08:00
2024-04-01 23:09:17 +08:00
.PHONY : run -frontend
2019-11-12 18:08:40 +08:00
run-frontend : deps -js ## Fetch js dependencies and watch frontend for rebuild
yarn start
2025-06-19 18:36:37 +08:00
.PHONY : run -air
run-air : ## [Experimental] Build and run backend, and watch for changes. See .air.toml for configuration. Check https://github.com/air-verse/air for installation instructions.
air -c .air.toml
2019-10-22 22:03:22 +08:00
##@ Testing
2022-07-19 16:04:38 +08:00
.PHONY : test -go
test-go : test -go -unit test -go -integration
.PHONY : test -go -unit
test-go-unit : ## Run unit tests for backend with flags.
2025-05-13 19:08:19 +08:00
@echo " backend unit tests ( $( SHARD) / $( SHARDS) ) "
$( GO) test $( GO_RACE_FLAG) $( GO_TEST_FLAGS) -v -short -timeout= 30m \
$( shell ./scripts/ci/backend-tests/shard.sh -n$( SHARD) -m$( SHARDS) -s)
2025-03-13 01:00:13 +08:00
2024-08-26 21:32:42 +08:00
.PHONY : test -go -unit -pretty
test-go-unit-pretty : check -tparse
@if [ -z " $( FILES) " ] ; then \
echo "Notice: FILES variable is not set. Try \"make test-go-unit-pretty FILES=./pkg/services/mysvc\"" ; \
exit 1; \
fi
2025-03-17 17:47:27 +08:00
$( GO) test $( GO_RACE_FLAG) $( GO_TEST_FLAGS) -timeout= 10s $( FILES) -json | tparse -all
2024-08-26 21:32:42 +08:00
2022-07-19 16:04:38 +08:00
.PHONY : test -go -integration
test-go-integration : ## Run integration tests for backend with flags.
@echo "test backend integration tests"
2025-05-13 19:08:19 +08:00
$( GO) test $( GO_RACE_FLAG) $( GO_TEST_FLAGS) -count= 1 -run "^TestIntegration" -covermode= atomic -coverprofile= $( GO_INTEGRATION_COVER_PROFILE) -timeout= 5m \
$( shell ./scripts/ci/backend-tests/pkgs-with-tests-named.sh -b TestIntegration | ./scripts/ci/backend-tests/shard.sh -n$( SHARD) -m$( SHARDS) -s)
2022-07-19 16:04:38 +08:00
2023-10-17 18:21:45 +08:00
.PHONY : test -go -integration -alertmanager
test-go-integration-alertmanager : ## Run integration tests for the remote alertmanager (config taken from the mimir_backend block).
@echo "test remote alertmanager integration tests"
$( GO) clean -testcache
2023-11-24 00:59:36 +08:00
AM_URL = http://localhost:8080 AM_TENANT_ID = test \
2024-05-31 23:30:51 +08:00
$( GO) test $( GO_RACE_FLAG) -count= 1 -run "^TestIntegrationRemoteAlertmanager" -covermode= atomic -timeout= 5m ./pkg/services/ngalert/...
2023-10-17 18:21:45 +08:00
2025-02-13 18:36:45 +08:00
.PHONY : test -go -integration -grafana -alertmanager
test-go-integration-grafana-alertmanager : ## Run integration tests for the grafana alertmanager
@echo "test grafana alertmanager integration tests"
@export GRAFANA_VERSION = 11.5.0-81938; \
$( GO) run tools/setup_grafana_alertmanager_integration_test_images.go; \
$( GO) clean -testcache; \
$( GO) test $( GO_RACE_FLAG) -count= 1 -run "^TestAlertmanagerIntegration" -covermode= atomic -timeout= 10m ./pkg/tests/alertmanager/...
2022-07-19 16:04:38 +08:00
.PHONY : test -go -integration -postgres
test-go-integration-postgres : devenv -postgres ## Run integration tests for postgres backend with flags.
@echo "test backend integration postgres tests"
$( GO) clean -testcache
2023-04-18 00:33:43 +08:00
GRAFANA_TEST_DB = postgres \
2025-05-13 19:08:19 +08:00
$( GO) test $( GO_RACE_FLAG) $( GO_TEST_FLAGS) -p= 1 -count= 1 -run "^TestIntegration" -covermode= atomic -timeout= 10m \
$( shell ./scripts/ci/backend-tests/pkgs-with-tests-named.sh -b TestIntegration | ./scripts/ci/backend-tests/shard.sh -n$( SHARD) -m$( SHARDS) -s)
2022-07-19 16:04:38 +08:00
.PHONY : test -go -integration -mysql
test-go-integration-mysql : devenv -mysql ## Run integration tests for mysql backend with flags.
@echo "test backend integration mysql tests"
2023-04-18 00:33:43 +08:00
GRAFANA_TEST_DB = mysql \
2025-05-13 19:08:19 +08:00
$( GO) test $( GO_RACE_FLAG) $( GO_TEST_FLAGS) -p= 1 -count= 1 -run "^TestIntegration" -covermode= atomic -timeout= 10m \
$( shell ./scripts/ci/backend-tests/pkgs-with-tests-named.sh -b TestIntegration | ./scripts/ci/backend-tests/shard.sh -n$( SHARD) -m$( SHARDS) -s)
2016-10-11 14:51:44 +08:00
2023-04-05 16:55:55 +08:00
.PHONY : test -go -integration -redis
test-go-integration-redis : ## Run integration tests for redis cache.
@echo "test backend integration redis tests"
$( GO) clean -testcache
2025-05-13 19:08:19 +08:00
REDIS_URL = localhost:6379 $( GO) test $( GO_TEST_FLAGS) -run IntegrationRedis -covermode= atomic -timeout= 2m \
$( shell ./scripts/ci/backend-tests/pkgs-with-tests-named.sh -b TestIntegration | ./scripts/ci/backend-tests/shard.sh -n$( SHARD) -m$( SHARDS) -s)
2023-04-05 16:55:55 +08:00
.PHONY : test -go -integration -memcached
test-go-integration-memcached : ## Run integration tests for memcached cache.
@echo "test backend integration memcached tests"
$( GO) clean -testcache
2025-05-13 19:08:19 +08:00
MEMCACHED_HOSTS = localhost:11211 $( GO) test $( GO_RACE_FLAG) $( GO_TEST_FLAGS) -run IntegrationMemcached -covermode= atomic -timeout= 2m \
$( shell ./scripts/ci/backend-tests/pkgs-with-tests-named.sh -b TestIntegration | ./scripts/ci/backend-tests/shard.sh -n$( SHARD) -m$( SHARDS) -s)
2025-03-19 19:34:44 +08:00
2024-04-01 23:09:17 +08:00
.PHONY : test -js
2019-10-22 22:03:22 +08:00
test-js : ## Run tests for frontend.
2019-03-28 00:53:49 +08:00
@echo "test frontend"
2018-03-07 06:59:45 +08:00
yarn test
2016-04-26 00:44:26 +08:00
2024-04-01 23:09:17 +08:00
.PHONY : test
2019-10-22 22:03:22 +08:00
test : test -go test -js ## Run all tests.
2016-10-11 14:51:44 +08:00
2019-10-22 22:03:22 +08:00
##@ Linting
2024-04-01 23:09:17 +08:00
.PHONY : golangci -lint
2025-03-17 16:48:41 +08:00
golangci-lint :
2019-10-22 22:03:22 +08:00
@echo "lint via golangci-lint"
2025-05-21 17:22:24 +08:00
$( golangci-lint) run \
2024-11-26 16:19:53 +08:00
--config .golangci.yml \
2025-03-17 17:47:27 +08:00
$( if $( GO_BUILD_TAGS) ,--build-tags $( GO_BUILD_TAGS) ) \
2024-08-09 22:05:02 +08:00
$( GO_LINT_FILES)
2019-10-22 22:03:22 +08:00
2024-04-01 23:09:17 +08:00
.PHONY : lint -go
2024-08-09 22:05:02 +08:00
lint-go : golangci -lint ## Run all code checks for backend. You can use GO_LINT_FILES to specify exact files to check
2019-07-02 21:06:59 +08:00
2024-10-08 20:47:33 +08:00
.PHONY : lint -go -diff
2025-03-17 16:48:41 +08:00
lint-go-diff :
2024-10-10 04:32:23 +08:00
git diff --name-only $( GIT_BASE) | \
2024-10-08 20:47:33 +08:00
grep '\.go$$' | \
$( XARGSR) dirname | \
sort -u | \
sed 's,^,./,' | \
2025-05-21 17:22:24 +08:00
$( XARGSR) $( golangci-lint) run --config .golangci.yml
2024-10-08 20:47:33 +08:00
2019-07-23 18:12:33 +08:00
# with disabled SC1071 we are ignored some TCL,Expect `/usr/bin/env expect` scripts
2024-04-01 23:09:17 +08:00
.PHONY : shellcheck
2019-10-22 22:03:22 +08:00
shellcheck : $( SH_FILES ) ## Run checks for shell scripts.
2019-07-23 18:12:33 +08:00
@docker run --rm -v " $$ PWD:/mnt " koalaman/shellcheck:stable \
2019-10-02 16:11:15 +08:00
$( SH_FILES) -e SC1071 -e SC2162
2019-07-23 18:12:33 +08:00
2019-10-22 22:03:22 +08:00
##@ Docker
2023-03-01 04:18:00 +08:00
TAG_SUFFIX = $( if $( WIRE_TAGS) != oss,-$( WIRE_TAGS) )
PLATFORM = linux/amd64
2024-04-01 23:09:17 +08:00
.PHONY : build -docker -full
2019-10-22 22:03:22 +08:00
build-docker-full : ## Build Docker image for development.
@echo "build docker container"
2023-03-23 23:03:25 +08:00
tar -ch . | \
docker buildx build - \
2023-03-01 04:18:00 +08:00
--platform $( PLATFORM) \
--build-arg BINGO = false \
--build-arg GO_BUILD_TAGS = $( GO_BUILD_TAGS) \
--build-arg WIRE_TAGS = $( WIRE_TAGS) \
2023-09-27 03:15:39 +08:00
--build-arg COMMIT_SHA = $$ ( git rev-parse HEAD) \
2023-04-18 21:03:27 +08:00
--build-arg BUILD_BRANCH = $$ ( git rev-parse --abbrev-ref HEAD) \
2023-03-01 04:18:00 +08:00
--tag grafana/grafana$( TAG_SUFFIX) :dev \
$( DOCKER_BUILD_ARGS)
2019-10-22 22:03:22 +08:00
2024-04-01 23:09:17 +08:00
.PHONY : build -docker -full -ubuntu
2022-02-08 20:38:43 +08:00
build-docker-full-ubuntu : ## Build Docker image based on Ubuntu for development.
@echo "build docker container"
2023-03-23 23:03:25 +08:00
tar -ch . | \
docker buildx build - \
2023-03-01 04:18:00 +08:00
--platform $( PLATFORM) \
--build-arg BINGO = false \
--build-arg GO_BUILD_TAGS = $( GO_BUILD_TAGS) \
--build-arg WIRE_TAGS = $( WIRE_TAGS) \
2023-09-27 03:15:39 +08:00
--build-arg COMMIT_SHA = $$ ( git rev-parse HEAD) \
2023-04-18 21:03:27 +08:00
--build-arg BUILD_BRANCH = $$ ( git rev-parse --abbrev-ref HEAD) \
2023-09-28 21:48:41 +08:00
--build-arg BASE_IMAGE = ubuntu:22.04 \
2024-04-25 02:26:14 +08:00
--build-arg GO_IMAGE = golang:$( GO_VERSION) \
2023-03-01 04:18:00 +08:00
--tag grafana/grafana$( TAG_SUFFIX) :dev-ubuntu \
$( DOCKER_BUILD_ARGS)
2022-02-08 20:38:43 +08:00
2019-10-22 22:03:22 +08:00
##@ Services
2019-07-02 21:06:59 +08:00
2024-09-10 14:36:41 +08:00
COMPOSE := $( shell if docker compose --help >/dev/null 2>& 1; then echo docker compose; else echo docker-compose; fi )
i f e q ( $( COMPOSE ) , d o c k e r - c o m p o s e )
$(warning From July 2023 Compose V1 (docker-compose) stopped receiving updates. Migrate to Compose V2 (docker compose). https : //docs .docker .com /compose /migrate /)
e n d i f
# Create a Docker Compose file with provided sources and start them.
# For example, `make devenv sources=postgres,auth/openldap`
2024-04-01 23:09:17 +08:00
.PHONY : devenv
2019-05-29 00:32:14 +08:00
i f e q ( $( sources ) , )
devenv :
2024-09-10 14:36:41 +08:00
@printf 'You have to define sources for this command \nexample: make devenv sources=postgres,auth/openldap\n'
2019-05-29 00:32:14 +08:00
e l s e
2024-09-10 14:36:41 +08:00
devenv : devenv -down ## Start optional services like Postgresql, Prometheus, or Elasticsearch.
2019-05-25 09:38:01 +08:00
@cd devenv; \
2019-05-29 00:32:14 +08:00
./create_docker_compose.sh $( targets) || \
2019-07-16 14:16:11 +08:00
( rm -rf { docker-compose.yaml,conf.tmp,.env} ; exit 1)
2019-05-29 00:32:14 +08:00
@cd devenv; \
2024-09-10 14:36:41 +08:00
$( COMPOSE) up -d --build
2019-05-29 00:32:14 +08:00
e n d i f
2019-05-25 09:38:01 +08:00
2024-04-01 23:09:17 +08:00
.PHONY : devenv -down
2019-10-22 22:03:22 +08:00
devenv-down : ## Stop optional services.
2019-05-29 00:32:14 +08:00
@cd devenv; \
2019-05-29 01:08:27 +08:00
test -f docker-compose.yaml && \
2024-09-10 14:36:41 +08:00
$( COMPOSE) down || exit 0;
2019-10-22 22:03:22 +08:00
2024-04-01 23:09:17 +08:00
.PHONY : devenv -postgres
2022-07-19 16:04:38 +08:00
devenv-postgres :
@cd devenv; \
sources = postgres_tests
2024-04-01 23:09:17 +08:00
.PHONY : devenv -mysql
2022-07-19 16:04:38 +08:00
devenv-mysql :
@cd devenv; \
sources = mysql_tests
2019-10-22 22:03:22 +08:00
##@ Helpers
2020-04-21 22:16:41 +08:00
# We separate the protobuf generation because most development tasks on
# Grafana do not involve changing protobuf files and protoc is not a
# go-gettable dependency and so getting it installed can be inconvenient.
#
# If you are working on changes to protobuf interfaces you may either use
2024-04-01 23:09:17 +08:00
# this target or run the individual scripts below directly
.PHONY : protobuf
2020-04-21 22:16:41 +08:00
protobuf : ## Compile protobuf definitions
bash scripts/protobuf-check.sh
2025-05-16 03:36:52 +08:00
go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.36.5
2024-07-30 18:16:16 +08:00
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.4.0
2024-05-08 21:42:40 +08:00
buf generate pkg/plugins/backendplugin/pluginextensionv2 --template pkg/plugins/backendplugin/pluginextensionv2/buf.gen.yaml
2025-07-11 19:42:46 +08:00
buf generate apps/secret/decrypt/v1beta1 --template apps/secret/decrypt/v1beta1/buf.gen.yaml
2025-05-16 03:36:52 +08:00
buf generate pkg/storage/unified/proto --template pkg/storage/unified/proto/buf.gen.yaml
2024-11-12 17:19:12 +08:00
buf generate pkg/services/authz/proto/v1 --template pkg/services/authz/proto/v1/buf.gen.yaml
2025-01-28 01:47:33 +08:00
buf generate pkg/services/ngalert/store/proto/v1 --template pkg/services/ngalert/store/proto/v1/buf.gen.yaml
2020-04-21 22:16:41 +08:00
2024-04-01 23:09:17 +08:00
.PHONY : clean
2019-10-22 22:03:22 +08:00
clean : ## Clean up intermediate build artifacts.
@echo "cleaning"
rm -rf node_modules
rm -rf public/build
2024-04-01 23:09:17 +08:00
.PHONY : gen -ts
2021-11-16 03:45:35 +08:00
gen-ts :
@echo "generating TypeScript definitions"
go get github.com/tkrajina/typescriptify-golang-structs/typescriptify@v0.1.7
tscriptify -interface -package= github.com/grafana/grafana/pkg/services/live/pipeline -import= "import { FieldConfig } from '@grafana/data'" -target= public/app/features/live/pipeline/models.gen.ts pkg/services/live/pipeline/config.go
go mod tidy
2021-07-14 20:40:28 +08:00
# This repository's configuration is protected (https://readme.drone.io/signature/).
2021-08-12 16:39:09 +08:00
# Use this make target to regenerate the configuration YAML files when
2021-07-14 20:40:28 +08:00
# you modify starlark files.
2024-04-01 23:09:17 +08:00
.PHONY : drone
2021-10-22 04:28:57 +08:00
drone : $( DRONE )
2024-02-24 03:28:30 +08:00
bash scripts/drone/env-var-check.sh
2021-10-14 22:02:45 +08:00
$( DRONE) starlark --format
2021-11-30 18:53:07 +08:00
$( DRONE) lint .drone.yml --trusted
2021-10-14 22:02:45 +08:00
$( DRONE) --server https://drone.grafana.net sign --save grafana/grafana
2021-07-14 20:40:28 +08:00
2023-01-30 17:27:11 +08:00
# Generate an Emacs tags table (https://www.gnu.org/software/emacs/manual/html_node/emacs/Tags-Tables.html) for Starlark files.
2024-04-01 23:09:17 +08:00
.PHONY : scripts /drone /TAGS
2023-01-30 17:27:11 +08:00
scripts/drone/TAGS : $( shell find scripts /drone -name '*.star ')
etags --lang none --regex= "/def \(\w+\)[^:]+:/\1/" --regex= "/\s*\(\w+\) =/\1/" $^ -o $@
2024-04-01 23:09:17 +08:00
.PHONY : format -drone
2022-12-07 15:13:57 +08:00
format-drone :
2023-09-12 23:19:06 +08:00
buildifier --lint= fix -r scripts/drone
2022-12-07 15:13:57 +08:00
2024-05-30 07:34:16 +08:00
.PHONY : go -race -is -enabled
go-race-is-enabled :
@if [ -n " $( GO_RACE) " ] ; then \
echo "The Go race detector is enabled locally, yey!" ; \
else \
echo "The Go race detector is NOT enabled locally, boo!" ; \
fi ;
.PHONY : enable -go -race
enable-go-race :
@touch .go-race-enabled-locally
2024-08-26 21:32:42 +08:00
check-tparse :
@command -v tparse >/dev/null 2>& 1 || { \
echo >& 2 "Error: tparse is not installed. Refer to https://github.com/mfridman/tparse" ; \
exit 1; \
}
2024-04-01 23:09:17 +08:00
.PHONY : help
2019-10-22 22:03:22 +08:00
help : ## Display this help.
@awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m<target>\033[0m\n"} /^[a-zA-Z_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $( MAKEFILE_LIST)
2025-06-03 22:55:29 +08:00
# check licenses of used dependencies (can be run using build image using
# container/check-licenses target)
check-licenses :
license_finder --decisions-file .github/license_finder.yaml