diff --git a/Makefile b/Makefile index f14ced06..d482520a 100644 --- a/Makefile +++ b/Makefile @@ -4,67 +4,103 @@ NODE_VERSION=$(shell cat .nvmrc) GIT_SHA=$(shell git rev-parse --short HEAD) GIT_TAG=$(shell git describe --tags `git rev-list --tags --max-count=1`) -## Default target just build the project. -default: buildall -.PHONY: default +CI_RELEASER_VERSION=1.16.3-1 ## https://github.com/navidrome/ci-goreleaser -dev: check_env - npx foreman -j Procfile.dev -p 4533 start -.PHONY: dev - -server: check_go_env - @go run github.com/cespare/reflex -d none -c reflex.conf -.PHONY: server - -wire: check_go_env - go run github.com/google/wire/cmd/wire ./... -.PHONY: wire - -watch: - go run github.com/onsi/ginkgo/ginkgo watch -notify ./... -.PHONY: watch - -test: - go test ./... -v -.PHONY: test - -testall: - @(cd ./ui && npm test -- --watchAll=false) -.PHONY: testall - -lint: - go run github.com/golangci/golangci-lint/cmd/golangci-lint run -v --timeout 5m -.PHONY: lint - -lintall: lint - @(cd ./ui && npm run check-formatting && npm run lint) -.PHONY: lintall - -update-snapshots: - UPDATE_SNAPSHOTS=true go run github.com/onsi/ginkgo/ginkgo ./server/subsonic/... -.PHONY: update-snapshots - -migration: - @if [ -z "${name}" ]; then echo "Usage: make migration name=name_of_migration_file"; exit 1; fi - go run github.com/pressly/goose/cmd/goose -dir db/migration create ${name} -.PHONY: migration - -setup-dev: check_env download-deps setup-git - @echo Downloading Node dependencies... - @(cd ./ui && npm install) -.PHONY: setup-dev - -setup: check_env download-deps +setup: check_env download-deps ##@1_Run_First Install dependencies and prepare development environment @echo Downloading Node dependencies... @(cd ./ui && npm ci) .PHONY: setup -setup-git: +dev: check_env ##@Development Start Navidrome in development mode, with hot-reload for both frontend and backend + npx foreman -j Procfile.dev -p 4533 start +.PHONY: dev + +server: check_go_env ##@Development Start the backend in development mode + @go run github.com/cespare/reflex -d none -c reflex.conf +.PHONY: server + +wire: check_go_env ##@Development Update Dependency Injection + go run github.com/google/wire/cmd/wire ./... +.PHONY: wire + +watch: ##@Development Start Go tests in watch mode (re-run when code changes) + go run github.com/onsi/ginkgo/ginkgo watch -notify ./... +.PHONY: watch + +test: ##@Development Run Go tests + go test ./... -v +.PHONY: test + +testall: test ##@Development Run Go and JS tests + @(cd ./ui && npm test -- --watchAll=false) +.PHONY: testall + +lint: ##@Development Lint Go code + go run github.com/golangci/golangci-lint/cmd/golangci-lint run -v --timeout 5m +.PHONY: lint + +lintall: lint ##@Development Lint Go and JS code + @(cd ./ui && npm run check-formatting && npm run lint) +.PHONY: lintall + +update-snapshots: ##@Development Update Snapshot tests + UPDATE_SNAPSHOTS=true go run github.com/onsi/ginkgo/ginkgo ./server/subsonic/... +.PHONY: update-snapshots + +migration: ##@Development Create an empty migration file + @if [ -z "${name}" ]; then echo "Usage: make migration name=name_of_migration_file"; exit 1; fi + go run github.com/pressly/goose/cmd/goose -dir db/migration create ${name} +.PHONY: migration + +setup-dev: setup +.PHONY: setup-dev + +setup-git: ##@Development Setup Git hooks (pre-commit and pre-push) @echo Setting up git hooks @mkdir -p .git/hooks @(cd .git/hooks && ln -sf ../../git/* .) .PHONY: setup-git +buildall: buildjs build ##@Build Build the project, both frontend and backend +.PHONY: buildall + +build: check_go_env ##@Build Build only backend + go build -ldflags="-X github.com/navidrome/navidrome/consts.gitSha=$(GIT_SHA) -X github.com/navidrome/navidrome/consts.gitTag=$(GIT_TAG)-SNAPSHOT" -tags=netgo +.PHONY: build + +buildjs: check_node_env ##@Build Build only frontend + @(cd ./ui && npm run build) +.PHONY: buildjs + +all: ##@Cross_Compilation Build binaries for all supported platforms. It does not build the frontend + docker run -t -v $(PWD):/workspace -w /workspace deluan/ci-goreleaser:$(CI_RELEASER_VERSION) \ + goreleaser release --rm-dist --skip-publish --snapshot +.PHONY: all + +single: ##@Cross_Compilation Build binaries for a single supported platforms. It does not build the frontend + @if [ -z "${GOOS}" ]; then \ + echo "Usage: GOOS= GOARCH= make snapshot-single"; \ + echo "Options:"; \ + grep -- "- id: navidrome_" .goreleaser.yml | sed 's/- id: navidrome_//g'; \ + exit 1; \ + fi + @echo "Building binaries for ${GOOS}/${GOARCH}" + docker run -t -v $(PWD):/workspace -e GOOS -e GOARCH -w /workspace deluan/ci-goreleaser:$(CI_RELEASER_VERSION) \ + goreleaser build --rm-dist --snapshot --single-target --id navidrome_${GOOS}_${GOARCH} +.PHONY: single + +########################################## +#### Miscellaneous + +release: + @if [[ ! "${V}" =~ ^[0-9]+\.[0-9]+\.[0-9]+.*$$ ]]; then echo "Usage: make release V=X.X.X"; exit 1; fi + go mod tidy + @if [ -n "`git status -s`" ]; then echo "\n\nThere are pending changes. Please commit or stash first"; exit 1; fi + make pre-push + git tag v${V} + git push origin v${V} --no-verify +.PHONY: release + download-deps: @echo Downloading Go dependencies... @go mod download -x @@ -92,42 +128,17 @@ check_node_env: (echo "\nERROR: Please check your Node version. Should be at least $(NODE_VERSION)\n"; exit 1) .PHONY: check_node_env -build: check_go_env - go build -ldflags="-X github.com/navidrome/navidrome/consts.gitSha=$(GIT_SHA) -X github.com/navidrome/navidrome/consts.gitTag=$(GIT_TAG)-SNAPSHOT" -tags=netgo -.PHONY: build - -buildjs: check_node_env - @(cd ./ui && npm run build) -.PHONY: buildjs - -buildall: buildjs build -.PHONY: buildall - pre-push: lintall testall .PHONY: pre-push -release: - @if [[ ! "${V}" =~ ^[0-9]+\.[0-9]+\.[0-9]+.*$$ ]]; then echo "Usage: make release V=X.X.X"; exit 1; fi - go mod tidy - @if [ -n "`git status -s`" ]; then echo "\n\nThere are pending changes. Please commit or stash first"; exit 1; fi - make pre-push - git tag v${V} - git push origin v${V} --no-verify -.PHONY: release +.DEFAULT_GOAL := help -snapshot: - docker run -t -v $(PWD):/workspace -w /workspace deluan/ci-goreleaser:1.16.3-1 \ - goreleaser release --rm-dist --skip-publish --snapshot -.PHONY: snapshot +HELP_FUN = \ + %help; while(<>){push@{$$help{$$2//'options'}},[$$1,$$3] \ + if/^([\w-_]+)\s*:.*\#\#(?:@(\w+))?\s(.*)$$/}; \ + print"$$_:\n", map" $$_->[0]".(" "x(20-length($$_->[0])))."$$_->[1]\n",\ + @{$$help{$$_}},"\n" for sort keys %help; \ -snapshot-single: - @if [ -z "${GOOS}" ]; then \ - echo "Usage: GOOS= GOARCH= make snapshot-single"; \ - echo "Options:"; \ - grep -- "- id: navidrome_" .goreleaser.yml | sed 's/- id: navidrome_//g'; \ - exit 1; \ - fi - @echo "Building binaries for ${GOOS}/${GOARCH}" - docker run -t -v $(PWD):/workspace -e GOOS -e GOARCH -w /workspace deluan/ci-goreleaser:1.16.3-1 \ - goreleaser build --rm-dist --snapshot --single-target --id navidrome_${GOOS}_${GOARCH} -.PHONY: snapshot-single +help: ##@Miscellaneous Show this help + @echo "Usage: make [target] ...\n" + @perl -e '$(HELP_FUN)' $(MAKEFILE_LIST)