diff --git a/.gitignore b/.gitignore index 20fde386..33586a4d 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ *.so *.dylib cmd/versitygw/versitygw +/versitygw # Test binary, built with `go test -c` *.test @@ -23,3 +24,11 @@ go.work # ignore IntelliJ directories .idea + +# auto generated VERSION file +VERSION + +# build output +/versitygw.spec +*.tar +*.tar.gz diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..31003154 --- /dev/null +++ b/Makefile @@ -0,0 +1,73 @@ +# Copyright 2023 Versity Software +# This file is licensed under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +# Go parameters +GOCMD=go +GOBUILD=$(GOCMD) build +GOCLEAN=$(GOCMD) clean +GOTEST=$(GOCMD) test + +BIN=versitygw + +VERSION := $(shell if test -e VERSION; then cat VERSION; else git describe --abbrev=0 --tags HEAD; fi) +BUILD := $(shell git rev-parse --short HEAD || echo release-rpm) +TIME := `date -u '+%Y-%m-%d_%I:%M:%S%p'` + +LDFLAGS=-ldflags "-X=main.Build=$(BUILD) -X=main.BuildTime=$(TIME) -X=main.Version=$(VERSION)" + +all: build + +build: $(BIN) + +.PHONY: $(BIN) +$(BIN): + $(GOBUILD) $(LDFLAGS) -o $(BIN) cmd/$(BIN)/*.go + +.PHONY: test +test: + $(GOTEST) ./... + +.PHONY: check +check: +# note this requires staticcheck be in your PATH: +# export PATH=$PATH:~/go/bin +# go install honnef.co/go/tools/cmd/staticcheck@latest + staticcheck ./... + golint ./... + gofmt -s -l . + +.PHONY: clean +clean: + $(GOCLEAN) + +.PHONY: cleanall +cleanall: clean + rm -f $(BIN) + rm -f versitygw-*.tar + rm -f versitygw-*.tar.gz + rm -f versitygw.spec + +%.spec: %.spec.in + sed -e 's/@@VERSION@@/$(VERSION)/g' < $< > $@+ + mv $@+ $@ + +TARFILE = $(BIN)-$(VERSION).tar + +dist: $(BIN).spec + echo $(VERSION) >VERSION + git archive --format=tar --prefix $(BIN)-$(VERSION)/ HEAD > $(TARFILE) + @ tar rf $(TARFILE) --transform="s@\(.*\)@$(BIN)-$(VERSION)/\1@" $(BIN).spec VERSION + rm -f VERSION + rm -f $(BIN).spec + gzip -f $(TARFILE) diff --git a/cmd/versitygw/main.go b/cmd/versitygw/main.go index 7f59d7f1..b5022e3e 100644 --- a/cmd/versitygw/main.go +++ b/cmd/versitygw/main.go @@ -34,6 +34,15 @@ var ( certFile, keyFile string ) +var ( + // Version is the latest tag (set within Makefile) + Version = "git" + // Build is the commit hash (set within Makefile) + Build = "norev" + // BuildTime is the date/time of build (set within Makefile) + BuildTime = "none" +) + func main() { app := initApp() @@ -61,6 +70,18 @@ to access the supported backend storage as if it was a native S3 service.`, func initFlags() []cli.Flag { return []cli.Flag{ + &cli.BoolFlag{ + Name: "version", + Usage: "list versitygw version", + Aliases: []string{"v"}, + Action: func(*cli.Context, bool) error { + fmt.Println("Version :", Version) + fmt.Println("Build :", Build) + fmt.Println("BuildTime:", BuildTime) + os.Exit(0) + return nil + }, + }, &cli.StringFlag{ Name: "port", Usage: "gateway listen address : or :", diff --git a/versitygw.spec.in b/versitygw.spec.in new file mode 100644 index 00000000..f939e763 --- /dev/null +++ b/versitygw.spec.in @@ -0,0 +1,31 @@ +%global debug_package %{nil} +%define pkg_version @@VERSION@@ + +Name: versitygw +Version: %{pkg_version} +Release: 1%{?dist} +Summary: Versity S3 Gateway + +License: Apache-2.0 +URL: https://github.com/versity/versitygw +Source0: %{name}-%{version}.tar.gz +%description +The S3 gateway is an S3 protocol translator that allows an S3 client +to access the supported backend storage as if it was a native S3 service. + +BuildRequires: golang >= 1.20 + +%prep +%setup + +%build +make + +%install +mkdir -p %{buildroot}%{_bindir} +install -m 0755 %{name} %{buildroot}%{_bindir}/ + +%post + +%files +%{_bindir}/%{name}