build: use make for building the project (#1304)
This commit is contained in:
		
							parent
							
								
									2d2c598fa6
								
							
						
					
					
						commit
						23f84642e6
					
				|  | @ -1,55 +1,39 @@ | |||
| version: 2 | ||||
| version: 2.1 | ||||
| references: | ||||
|   base_container: &base_container | ||||
|     docker: | ||||
|       - image: filebrowser/builder:v1.1.0 | ||||
| jobs: | ||||
|   lint: | ||||
|     docker: | ||||
|       - image: golangci/golangci-lint:v1.31.0 | ||||
|     <<: *base_container | ||||
|     steps: | ||||
|       - checkout | ||||
|       - run: golangci-lint run -v | ||||
|   build-node: | ||||
|     docker: | ||||
|       - image: circleci/node | ||||
|     steps: | ||||
|       - checkout | ||||
|       - run: | ||||
|           name: "Build" | ||||
|           command: ./wizard.sh -a | ||||
|       - run: | ||||
|           name: "Cleanup" | ||||
|           command: rm -rf frontend/node_modules | ||||
|       - persist_to_workspace: | ||||
|           root: . | ||||
|           paths: | ||||
|             - '*' | ||||
|       - run: make lint | ||||
|   test: | ||||
|     docker: | ||||
|       - image: circleci/golang:1.15.2 | ||||
|     <<: *base_container | ||||
|     steps: | ||||
|       - checkout | ||||
|       - run: | ||||
|           name: "Test" | ||||
|           command: go test ./... | ||||
|   build-go: | ||||
|     docker: | ||||
|       - image: circleci/golang:1.15.2 | ||||
|           command: make test | ||||
|   build: | ||||
|     <<: *base_container | ||||
|     steps: | ||||
|       - attach_workspace: | ||||
|           at: '~/project' | ||||
|       - checkout | ||||
|       - run: | ||||
|           name: "Compile" | ||||
|           command: GOOS=linux GOARCH=amd64 ./wizard.sh -c | ||||
|           name: "Build" | ||||
|           command: make build | ||||
|       - run: | ||||
|           name: "Cleanup" | ||||
|           command: | | ||||
|             rm -rf frontend/build | ||||
|             git checkout -- go.sum # TODO: why is it being changed? | ||||
|             rm -rf frontend/node_modules | ||||
|             rm -rf bin/ | ||||
|       - persist_to_workspace: | ||||
|           root: . | ||||
|           paths: | ||||
|             - '*' | ||||
|   release: | ||||
|     docker: | ||||
|       - image: circleci/golang:1.15.2 | ||||
|     <<: *base_container | ||||
|     steps: | ||||
|       - attach_workspace: | ||||
|           at: '~/project' | ||||
|  | @ -69,22 +53,16 @@ workflows: | |||
|           filters: | ||||
|             tags: | ||||
|               only: /.*/ | ||||
|       - build-node: | ||||
|       - build: | ||||
|           filters: | ||||
|             tags: | ||||
|               only: /.*/ | ||||
|       - build-go: | ||||
|           filters: | ||||
|             tags: | ||||
|               only: /.*/ | ||||
|           requires: | ||||
|             - build-node | ||||
|             - lint | ||||
|             - test | ||||
|       - release: | ||||
|           context: deploy | ||||
|           requires: | ||||
|             - build-go | ||||
|             - build | ||||
|             - test | ||||
|             - lint | ||||
|           filters: | ||||
|             tags: | ||||
|               only: /^v.*/ | ||||
|  |  | |||
|  | @ -28,3 +28,5 @@ yarn-error.log* | |||
| *.njsproj | ||||
| *.sln | ||||
| *.sw* | ||||
| bin/ | ||||
| build/ | ||||
|  |  | |||
|  | @ -63,7 +63,6 @@ linters: | |||
|     - goconst | ||||
|     - gocritic | ||||
|     - gocyclo | ||||
|     - gofmt | ||||
|     - goimports | ||||
|     - golint | ||||
|     - gomnd | ||||
|  |  | |||
|  | @ -0,0 +1,14 @@ | |||
| { | ||||
|   "types": [ | ||||
|     { "type": "feat", "section": "Features" }, | ||||
|     { "type": "fix", "section": "Bug Fixes" }, | ||||
|     { "type": "perf", "section": "Performance improvements" }, | ||||
|     { "type": "revert", "section": "Reverts" }, | ||||
|     { "type": "refactor", "section": "Refactorings" }, | ||||
|     { "type": "build", "section": "Build" }, | ||||
|     { "type": "ci", "hidden": true }, | ||||
|     { "type": "test", "hidden": true }, | ||||
|     { "type": "chore", "hidden": true }, | ||||
|     { "type": "docs", "hidden": true } | ||||
|   ] | ||||
| } | ||||
|  | @ -0,0 +1,98 @@ | |||
| SHELL := /bin/bash | ||||
| BASE_PATH := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))) | ||||
| VERSION ?= $(shell git describe --tags --always --match=v* 2> /dev/null || \
 | ||||
|            			cat $(CURDIR)/.version 2> /dev/null || echo v0) | ||||
| VERSION_HASH = $(shell git rev-parse HEAD) | ||||
| 
 | ||||
| BIN = $(BASE_PATH)/bin | ||||
| PATH := $(BIN):$(PATH) | ||||
| export PATH | ||||
| 
 | ||||
| # printing
 | ||||
| V = 0 | ||||
| Q = $(if $(filter 1,$V),,@) | ||||
| M = $(shell printf "\033[34;1m▶\033[0m") | ||||
| 
 | ||||
| GO = GOGC=off go | ||||
| # go module
 | ||||
| MODULE = $(shell env GO111MODULE=on $(GO) list -m) | ||||
| 
 | ||||
| DATE    ?= $(shell date +%FT%T%z) | ||||
| VERSION ?= $(shell git describe --tags --always --match=v* 2> /dev/null || \
 | ||||
| 			cat $(CURDIR)/.version 2> /dev/null || echo v0) | ||||
| VERSION_HASH = 	$(shell git rev-parse HEAD) | ||||
| BRANCH = $(shell git rev-parse --abbrev-ref HEAD) | ||||
| 
 | ||||
| LDFLAGS += -X "$(MODULE)/varsion.Version=$(VERSION)" -X "$(MODULE)/varsion.CommitSHA=$(VERSION_HASH)" | ||||
| 
 | ||||
| # tools
 | ||||
| $(BIN): | ||||
| 	@mkdir -p $@ | ||||
| $(BIN)/%: | $(BIN) ; $(info $(M) installing $(PACKAGE)…) | ||||
| 	$Q env GOBIN=$(BIN) $(GO) install $(PACKAGE) | ||||
| 
 | ||||
| GOLANGCI_LINT = $(BIN)/golangci-lint | ||||
| $(BIN)/golangci-lint: PACKAGE=github.com/golangci/golangci-lint/cmd/golangci-lint@v1.37.1 | ||||
| 
 | ||||
| GOIMPORTS = $(BIN)/goimports | ||||
| $(BIN)/goimports: PACKAGE=golang.org/x/tools/cmd/goimports@v0.1.0 | ||||
| 
 | ||||
| RICE = $(BIN)/rice | ||||
| $(BIN)/rice: PACKAGE=github.com/GeertJohan/go.rice/rice@v1.0.2 | ||||
| 
 | ||||
| ## build: Build
 | ||||
| .PHONY: build | ||||
| build: | build-frontend build-backend ; $(info $(M) building…) | ||||
| 
 | ||||
| ## build-frontend: Build frontend
 | ||||
| .PHONY: build-frontend | ||||
| build-frontend: | ; $(info $(M) building frontend…) | ||||
| 	$Q cd frontend && npm ci && npm run build | ||||
| 
 | ||||
| ## build-backend: Build backend
 | ||||
| .PHONY: build-backend | ||||
| build-backend: | $(RICE) ; $(info $(M) building backend…) | ||||
| 	$Q cd ./http && rm -rf rice-box.go && $(RICE) embed-go | ||||
| 	$Q $(GO) build -ldflags '$(LDFLAGS)' -o filebrowser | ||||
| 
 | ||||
| ## test: Run all tests
 | ||||
| .PHONY: test | ||||
| test: | test-frontend test-backend ; $(info $(M) running tests…) | ||||
| 
 | ||||
| ## test-frontend: Run frontend tests
 | ||||
| .PHONY: test-frontend | ||||
| test-frontend: | ; $(info $(M) running frontend tests…) | ||||
| 
 | ||||
| ## test-backend: Run backend tests
 | ||||
| .PHONY: test-backend | ||||
| test-backend: | $(RICE) ; $(info $(M) running backend tests…) | ||||
| 	$Q $(GO) test -v ./... | ||||
| 
 | ||||
| ## lint: Lint
 | ||||
| .PHONY: lint | ||||
| lint: lint-frontend lint-backend lint-commits | ; $(info $(M) running all linters…) | ||||
| 
 | ||||
| ## lint-frontend: Lint frontend
 | ||||
| .PHONY: lint-frontend | ||||
| lint-frontend: | ; $(info $(M) running frontend linters…) | ||||
| 	$Q cd frontend && npm ci && npm run lint | ||||
| 
 | ||||
| ## lint-backend: Lint backend
 | ||||
| .PHONY: lint-backend | ||||
| lint-backend: | $(GOLANGCI_LINT) ; $(info $(M) running backend linters…) | ||||
| 	$Q $(GOLANGCI_LINT) run | ||||
| 
 | ||||
| ## lint-commits: Lint commits
 | ||||
| .PHONY: lint-commits | ||||
| lint-commits: | ; $(info $(M) running commitlint…) | ||||
| 	$Q ./scripts/commitlint.sh | ||||
| 
 | ||||
| ## bump-version: Bump app version
 | ||||
| .PHONY: bump-version | ||||
| bump-version: | ; $(info $(M) creating a new release…) | ||||
| 	$Q ./scripts/bump_version.sh | ||||
| 
 | ||||
| ## help: Show this help
 | ||||
| .PHONY: help | ||||
| help: | ||||
| 	@sed -n 's/^## //p' $(MAKEFILE_LIST) | column -t -s ':' |  sed -e 's/^/ /' | sort | ||||
|  | @ -40,7 +40,7 @@ func (a JSONAuth) Auth(r *http.Request, sto users.Store, root string) (*users.Us | |||
| 
 | ||||
| 	// If ReCaptcha is enabled, check the code.
 | ||||
| 	if a.ReCaptcha != nil && len(a.ReCaptcha.Secret) > 0 { | ||||
| 		ok, err := a.ReCaptcha.Ok(cred.ReCaptcha) //nolint:shadow
 | ||||
| 		ok, err := a.ReCaptcha.Ok(cred.ReCaptcha) //nolint:govet
 | ||||
| 
 | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
|  |  | |||
|  | @ -14,7 +14,7 @@ var cmdsAddCmd = &cobra.Command{ | |||
| 	Use:   "add <event> <command>", | ||||
| 	Short: "Add a command to run on a specific event", | ||||
| 	Long:  `Add a command to run on a specific event.`, | ||||
| 	Args:  cobra.MinimumNArgs(2), //nolint:mnd
 | ||||
| 	Args:  cobra.MinimumNArgs(2), //nolint:gomnd
 | ||||
| 	Run: python(func(cmd *cobra.Command, args []string, d pythonData) { | ||||
| 		s, err := d.store.Settings.Get() | ||||
| 		checkErr(err) | ||||
|  |  | |||
|  | @ -23,7 +23,7 @@ You can also specify an optional parameter (index_end) so | |||
| you can remove all commands from 'index' to 'index_end', | ||||
| including 'index_end'.`, | ||||
| 	Args: func(cmd *cobra.Command, args []string) error { | ||||
| 		if err := cobra.RangeArgs(2, 3)(cmd, args); err != nil { //nolint:mnd
 | ||||
| 		if err := cobra.RangeArgs(2, 3)(cmd, args); err != nil { //nolint:gomnd
 | ||||
| 			return err | ||||
| 		} | ||||
| 
 | ||||
|  | @ -43,7 +43,7 @@ including 'index_end'.`, | |||
| 		i, err := strconv.Atoi(args[1]) | ||||
| 		checkErr(err) | ||||
| 		f := i | ||||
| 		if len(args) == 3 { //nolint:mnd
 | ||||
| 		if len(args) == 3 { //nolint:gomnd
 | ||||
| 			f, err = strconv.Atoi(args[2]) | ||||
| 			checkErr(err) | ||||
| 		} | ||||
|  |  | |||
|  | @ -152,12 +152,15 @@ user created with the credentials from options "username" and "password".`, | |||
| 			err = os.Chmod(server.Socket, os.FileMode(socketPerm)) | ||||
| 			checkErr(err) | ||||
| 		case server.TLSKey != "" && server.TLSCert != "": | ||||
| 			cer, err := tls.LoadX509KeyPair(server.TLSCert, server.TLSKey) //nolint:shadow
 | ||||
| 			cer, err := tls.LoadX509KeyPair(server.TLSCert, server.TLSKey) //nolint:govet
 | ||||
| 			checkErr(err) | ||||
| 			listener, err = tls.Listen("tcp", adr, &tls.Config{Certificates: []tls.Certificate{cer}}) //nolint:shadow
 | ||||
| 			listener, err = tls.Listen("tcp", adr, &tls.Config{ | ||||
| 				MinVersion:   tls.VersionTLS12, | ||||
| 				Certificates: []tls.Certificate{cer}}, | ||||
| 			) | ||||
| 			checkErr(err) | ||||
| 		default: | ||||
| 			listener, err = net.Listen("tcp", adr) //nolint:shadow
 | ||||
| 			listener, err = net.Listen("tcp", adr) | ||||
| 			checkErr(err) | ||||
| 		} | ||||
| 
 | ||||
|  |  | |||
|  | @ -44,7 +44,7 @@ including 'index_end'.`, | |||
| 		i, err := strconv.Atoi(args[0]) | ||||
| 		checkErr(err) | ||||
| 		f := i | ||||
| 		if len(args) == 2 { //nolint:mnd
 | ||||
| 		if len(args) == 2 { //nolint:gomnd
 | ||||
| 			f, err = strconv.Atoi(args[1]) | ||||
| 			checkErr(err) | ||||
| 		} | ||||
|  |  | |||
|  | @ -15,7 +15,7 @@ var usersAddCmd = &cobra.Command{ | |||
| 	Use:   "add <username> <password>", | ||||
| 	Short: "Create a new user", | ||||
| 	Long:  `Create a new user and add it to the database.`, | ||||
| 	Args:  cobra.ExactArgs(2), //nolint:mnd
 | ||||
| 	Args:  cobra.ExactArgs(2), //nolint:gomnd
 | ||||
| 	Run: python(func(cmd *cobra.Command, args []string, d pythonData) { | ||||
| 		s, err := d.store.Settings.Get() | ||||
| 		checkErr(err) | ||||
|  |  | |||
|  | @ -67,7 +67,7 @@ list or set it to 0.`, | |||
| 				// with the new username. If there is, print an error and cancel the
 | ||||
| 				// operation
 | ||||
| 				if user.Username != onDB.Username { | ||||
| 					if conflictuous, err := d.store.Users.Get("", user.Username); err == nil { //nolint:shadow
 | ||||
| 					if conflictuous, err := d.store.Users.Get("", user.Username); err == nil { //nolint:govet
 | ||||
| 						checkErr(usernameConflictError(user.Username, conflictuous.ID, user.ID)) | ||||
| 					} | ||||
| 				} | ||||
|  |  | |||
|  | @ -72,7 +72,7 @@ func dbExists(path string) (bool, error) { | |||
| 		d := filepath.Dir(path) | ||||
| 		_, err = os.Stat(d) | ||||
| 		if os.IsNotExist(err) { | ||||
| 			if err := os.MkdirAll(d, 0700); err != nil { //nolint:shadow
 | ||||
| 			if err := os.MkdirAll(d, 0700); err != nil { //nolint:govet
 | ||||
| 				return false, err | ||||
| 			} | ||||
| 			return false, nil | ||||
|  |  | |||
|  | @ -0,0 +1,34 @@ | |||
| module.exports = { | ||||
|     rules: { | ||||
|         'body-leading-blank': [1, 'always'], | ||||
|         'body-max-line-length': [2, 'always', 100], | ||||
|         'footer-leading-blank': [1, 'always'], | ||||
|         'footer-max-line-length': [2, 'always', 100], | ||||
|         'header-max-length': [2, 'always', 100], | ||||
|         'scope-case': [2, 'always', 'lower-case'], | ||||
|         'subject-case': [ | ||||
|             2, | ||||
|             'never', | ||||
|             ['sentence-case', 'start-case', 'pascal-case', 'upper-case'], | ||||
|         ], | ||||
|         'subject-full-stop': [2, 'never', '.'], | ||||
|         'type-case': [2, 'always', 'lower-case'], | ||||
|         'type-empty': [2, 'never'], | ||||
|         'type-enum': [ | ||||
|             2, | ||||
|             'always', | ||||
|             [ | ||||
|                 'feat', | ||||
|                 'fix', | ||||
|                 'perf', | ||||
|                 'revert', | ||||
|                 'refactor', | ||||
|                 'build', | ||||
|                 'ci', | ||||
|                 'test', | ||||
|                 'chore', | ||||
|                 'docs', | ||||
|             ], | ||||
|         ], | ||||
|     }, | ||||
| }; | ||||
|  | @ -79,7 +79,7 @@ func NewFileInfo(opts FileOptions) (*FileInfo, error) { | |||
| 
 | ||||
| 	if opts.Expand { | ||||
| 		if file.IsDir { | ||||
| 			if err := file.readListing(opts.Checker, opts.ReadHeader); err != nil { //nolint:shadow
 | ||||
| 			if err := file.readListing(opts.Checker, opts.ReadHeader); err != nil { //nolint:govet
 | ||||
| 				return nil, err | ||||
| 			} | ||||
| 			return file, nil | ||||
|  |  | |||
|  | @ -32,7 +32,7 @@ func wsErr(ws *websocket.Conn, r *http.Request, status int, err error) { //nolin | |||
| 	if err != nil || status >= 400 { | ||||
| 		log.Printf("%s: %v %s %v", r.URL.Path, status, r.RemoteAddr, err) | ||||
| 	} | ||||
| 	if err := ws.WriteControl(websocket.CloseInternalServerErr, []byte(txt), time.Now().Add(WSWriteDeadline)); err != nil { //nolint:shadow
 | ||||
| 	if err := ws.WriteControl(websocket.CloseInternalServerErr, []byte(txt), time.Now().Add(WSWriteDeadline)); err != nil { | ||||
| 		log.Print(err) | ||||
| 	} | ||||
| } | ||||
|  | @ -47,7 +47,7 @@ var commandsHandler = withUser(func(w http.ResponseWriter, r *http.Request, d *d | |||
| 	var raw string | ||||
| 
 | ||||
| 	for { | ||||
| 		_, msg, err := conn.ReadMessage() //nolint:shadow
 | ||||
| 		_, msg, err := conn.ReadMessage() //nolint:govet
 | ||||
| 		if err != nil { | ||||
| 			wsErr(conn, r, http.StatusInternalServerError, err) | ||||
| 			return 0, nil | ||||
|  | @ -60,7 +60,7 @@ var commandsHandler = withUser(func(w http.ResponseWriter, r *http.Request, d *d | |||
| 	} | ||||
| 
 | ||||
| 	if !d.server.EnableExec || !d.user.CanExecute(strings.Split(raw, " ")[0]) { | ||||
| 		if err := conn.WriteMessage(websocket.TextMessage, cmdNotAllowed); err != nil { //nolint:shadow
 | ||||
| 		if err := conn.WriteMessage(websocket.TextMessage, cmdNotAllowed); err != nil { //nolint:govet
 | ||||
| 			wsErr(conn, r, http.StatusInternalServerError, err) | ||||
| 		} | ||||
| 
 | ||||
|  | @ -69,7 +69,7 @@ var commandsHandler = withUser(func(w http.ResponseWriter, r *http.Request, d *d | |||
| 
 | ||||
| 	command, err := runner.ParseCommand(d.settings, raw) | ||||
| 	if err != nil { | ||||
| 		if err := conn.WriteMessage(websocket.TextMessage, []byte(err.Error())); err != nil { //nolint:shadow
 | ||||
| 		if err := conn.WriteMessage(websocket.TextMessage, []byte(err.Error())); err != nil { //nolint:govet
 | ||||
| 			wsErr(conn, r, http.StatusInternalServerError, err) | ||||
| 		} | ||||
| 		return 0, nil | ||||
|  |  | |||
|  | @ -70,7 +70,7 @@ func TestPublicShareHandlerAuthentication(t *testing.T) { | |||
| 				} | ||||
| 
 | ||||
| 				t.Cleanup(func() { | ||||
| 					if err := db.Close(); err != nil { //nolint:shadow
 | ||||
| 					if err := db.Close(); err != nil { //nolint:govet
 | ||||
| 						t.Errorf("failed to close db: %v", err) | ||||
| 					} | ||||
| 				}) | ||||
|  |  | |||
|  | @ -33,7 +33,7 @@ func parseQueryFiles(r *http.Request, f *files.FileInfo, _ *users.User) ([]strin | |||
| 		fileSlice = append(fileSlice, f.Path) | ||||
| 	} else { | ||||
| 		for _, name := range names { | ||||
| 			name, err := url.QueryUnescape(strings.Replace(name, "+", "%2B", -1)) //nolint:shadow
 | ||||
| 			name, err := url.QueryUnescape(strings.Replace(name, "+", "%2B", -1)) //nolint:govet
 | ||||
| 			if err != nil { | ||||
| 				return nil, err | ||||
| 			} | ||||
|  |  | |||
|  | @ -46,7 +46,7 @@ func handleWithStaticData(w http.ResponseWriter, _ *http.Request, d *data, box * | |||
| 
 | ||||
| 	if d.settings.Branding.Files != "" { | ||||
| 		fPath := filepath.Join(d.settings.Branding.Files, "custom.css") | ||||
| 		_, err := os.Stat(fPath) //nolint:shadow
 | ||||
| 		_, err := os.Stat(fPath) //nolint:govet
 | ||||
| 
 | ||||
| 		if err != nil && !os.IsNotExist(err) { | ||||
| 			log.Printf("couldn't load custom styles: %v", err) | ||||
|  | @ -58,7 +58,7 @@ func handleWithStaticData(w http.ResponseWriter, _ *http.Request, d *data, box * | |||
| 	} | ||||
| 
 | ||||
| 	if d.settings.AuthMethod == auth.MethodJSONAuth { | ||||
| 		raw, err := d.store.Auth.Get(d.settings.AuthMethod) //nolint:shadow
 | ||||
| 		raw, err := d.store.Auth.Get(d.settings.AuthMethod) //nolint:govet
 | ||||
| 		if err != nil { | ||||
| 			return http.StatusInternalServerError, err | ||||
| 		} | ||||
|  |  | |||
|  | @ -0,0 +1,14 @@ | |||
| #!/usr/bin/env bash | ||||
| set -e | ||||
| 
 | ||||
| if ! [ -x "$(command -v standard-version)" ]; then | ||||
|   echo "standard-version is not installed. please run 'npm i -g standard-version'" | ||||
|   exit 1 | ||||
| fi | ||||
| 
 | ||||
| standard-version --dry-run --skip | ||||
| read -p "Continue (y/n)? " -n 1 -r | ||||
| echo ; | ||||
| if [[ $REPLY =~ ^[Yy]$ ]]; then | ||||
| 	standard-version -s ; | ||||
| fi | ||||
|  | @ -0,0 +1,11 @@ | |||
| #!/usr/bin/env bash | ||||
| set -e | ||||
| 
 | ||||
| if ! [ -x "$(command -v commitlint)" ]; then | ||||
|   echo "commitlint is not installed. please run 'npm i -g commitlint'" | ||||
|   exit 1 | ||||
| fi | ||||
| 
 | ||||
| for commit_hash in $(git log --pretty=format:%H origin/master..HEAD); do | ||||
|   commitlint -f ${commit_hash}~1 -t ${commit_hash} | ||||
| done | ||||
|  | @ -63,7 +63,7 @@ func (s *Storage) Gets(baseScope string) ([]*User, error) { | |||
| 	} | ||||
| 
 | ||||
| 	for _, user := range users { | ||||
| 		if err := user.Clean(baseScope); err != nil { //nolint:shadow
 | ||||
| 		if err := user.Clean(baseScope); err != nil { //nolint:govet
 | ||||
| 			return nil, err | ||||
| 		} | ||||
| 	} | ||||
|  |  | |||
							
								
								
									
										129
									
								
								wizard.sh
								
								
								
								
							
							
						
						
									
										129
									
								
								wizard.sh
								
								
								
								
							|  | @ -1,129 +0,0 @@ | |||
| #!/usr/bin/env sh | ||||
| 
 | ||||
| set -e | ||||
| 
 | ||||
| untracked="(untracked)" | ||||
| REPO=$(cd $(dirname $0); pwd) | ||||
| COMMIT_SHA=$(git rev-parse --short HEAD) | ||||
| ASSETS="false" | ||||
| BINARY="false" | ||||
| RELEASE="" | ||||
| 
 | ||||
| debugInfo () { | ||||
|   echo "Repo:           $REPO" | ||||
|   echo "Build assets:   $ASSETS" | ||||
|   echo "Build binary:   $BINARY" | ||||
|   echo "Release:        $RELEASE" | ||||
| } | ||||
| 
 | ||||
| buildAssets () { | ||||
|   cd $REPO | ||||
|   rm -rf frontend/dist | ||||
|   rm -f http/rice-box.go | ||||
| 
 | ||||
|   cd $REPO/frontend | ||||
| 
 | ||||
|   if [ "$CI" = "true" ]; then | ||||
|     npm ci | ||||
|   else | ||||
|     npm install | ||||
|   fi | ||||
| 
 | ||||
|   npm run lint | ||||
|   npm run build | ||||
| } | ||||
| 
 | ||||
| buildBinary () { | ||||
|   if ! [ -x "$(command -v rice)" ]; then | ||||
|     go install github.com/GeertJohan/go.rice/rice | ||||
|   fi | ||||
| 
 | ||||
|   cd $REPO/http | ||||
|   rm -rf rice-box.go | ||||
|   rice embed-go | ||||
| 
 | ||||
|   cd $REPO | ||||
|   go build -a -o filebrowser -ldflags "-s -w -X github.com/filebrowser/filebrowser/v2/version.CommitSHA=$COMMIT_SHA" | ||||
| } | ||||
| 
 | ||||
| release () { | ||||
|   cd $REPO | ||||
| 
 | ||||
|   echo "👀 Checking semver format" | ||||
| 
 | ||||
|   if [ $# -ne 1 ]; then | ||||
|     echo "❌ This release script requires a single argument corresponding to the semver to be released. See semver.org" | ||||
|     exit 1 | ||||
|   fi | ||||
| 
 | ||||
|   GREP="grep" | ||||
|   if [ -x "$(command -v ggrep)" ]; then | ||||
|     GREP="ggrep" | ||||
|   fi | ||||
| 
 | ||||
|   semver=$(echo "$1" | $GREP -P '^v(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)') | ||||
| 
 | ||||
|   if [ $? -ne 0 ]; then | ||||
|     echo "❌ Not valid semver format. See semver.org" | ||||
|     exit 1 | ||||
|   fi | ||||
| 
 | ||||
|   echo "🧼  Tidying up go modules" | ||||
|   go mod tidy | ||||
| 
 | ||||
|   echo "🐑 Creating a new commit for the new release" | ||||
|   git commit --allow-empty -am "chore: version $semver" | ||||
|   git tag "$1" | ||||
|   git push | ||||
|   git push --tags origin | ||||
| 
 | ||||
|   echo "📦 Done! $semver released." | ||||
| } | ||||
| 
 | ||||
| usage() { | ||||
|   echo "Usage: $0 [-a] [-c] [-b] [-r <string>]" 1>&2; | ||||
|   exit 1; | ||||
| } | ||||
| 
 | ||||
| DEBUG="false" | ||||
| 
 | ||||
| while getopts "bacr:d" o; do | ||||
|   case "${o}" in | ||||
|     b) | ||||
|       ASSETS="true" | ||||
|       BINARY="true" | ||||
|       ;; | ||||
|     a) | ||||
|       ASSETS="true" | ||||
|       ;; | ||||
|     c) | ||||
|       BINARY="true" | ||||
|       ;; | ||||
|     r) | ||||
|       RELEASE=${OPTARG} | ||||
|       ;; | ||||
|     d) | ||||
|       DEBUG="true" | ||||
|       ;; | ||||
|     *) | ||||
|       usage | ||||
|       ;; | ||||
|   esac | ||||
| done | ||||
| shift $((OPTIND-1)) | ||||
| 
 | ||||
| if [ "$DEBUG" = "true" ]; then | ||||
|   debugInfo | ||||
| fi | ||||
| 
 | ||||
| if [ "$ASSETS" = "true" ]; then | ||||
|   buildAssets | ||||
| fi | ||||
| 
 | ||||
| if [ "$BINARY" = "true" ]; then | ||||
|   buildBinary | ||||
| fi | ||||
| 
 | ||||
| if [ "$RELEASE" != "" ]; then | ||||
|   release $RELEASE | ||||
| fi | ||||
		Loading…
	
		Reference in New Issue