diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index cb7a808..5b299f1 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -22,11 +22,19 @@ jobs: with: go-version: ${{ matrix.go-version }} + - name: Set Release Version + id: set_release_version + run: | + echo "RELEASE_VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV + - name: Install dependencies - run: make install + run: make setup - name: Build - run: make build-all + run: | + export AppVersion="${{ env.RELEASE_VERSION }}" + echo "Building version: $AppVersion" + make build-all - name: Archive build artifacts uses: actions/upload-artifact@v3 diff --git a/.gitignore b/.gitignore index 5814d4c..220fe3e 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,8 @@ gozen-* # Test binary, built with `go test -c` *.test *.out +coverage.out # Directory build/ +coverage/ diff --git a/Makefile b/Makefile index 483f257..813fb7d 100644 --- a/Makefile +++ b/Makefile @@ -1,23 +1,54 @@ -# Install dependencies +VERSION := $(or $(AppVersion), "v0.0.0") +COMMIT := $(or $(shell git rev-parse --short HEAD), "unknown") +BUILDDATE := $(shell date +%Y-%m-%d) -install: +LDFLAGS := -X 'main.AppVersion=$(VERSION)' -X 'main.CommitHash=$(COMMIT)' -X 'main.BuildDate=$(BUILDDATE)' + +all: build + +setup: go mod tidy test: go test -v ./... -race -coverprofile=coverage.out -covermode=atomic +coverage: test + go tool cover -func=coverage.out + +coverage-html: test + mkdir -p coverage + go tool cover -html=coverage.out -o coverage/index.html + +coverage-serve: coverage-html + python3 -m http.server 8080 -d coverage + +install: build + cp gozen /usr/local/bin/gozen + # cp man/gozen.1 /usr/local/share/man/man1/gozen.1 + build: - go build -o gozen + go build -ldflags="$(LDFLAGS)" -o gozen build-all: - GOOS=linux GOARCH=amd64 go build -o build/gozen-linux-amd64 - GOOS=linux GOARCH=arm64 go build -o build/gozen-linux-arm64 - GOOS=linux GOARCH=arm go build -o build/gozen-linux-arm - GOOS=darwin GOARCH=amd64 go build -o build/gozen-darwin-amd64 - GOOS=darwin GOARCH=arm64 go build -o build/gozen-darwin-arm64 - GOOS=windows GOARCH=amd64 go build -o build/gozen-windows-amd64.exe - GOOS=windows GOARCH=386 go build -o build/gozen-windows-i386.exe + GOOS=linux GOARCH=amd64 go build -ldflags="$(LDFLAGS)" -o build/gozen-linux-amd64 + cp build/gozen-linux-amd64 build/gozen + tar -zcvf build/gozen-linux-amd64.tar.gz build/gozen-linux-amd64 man/gozen.1 + GOOS=linux GOARCH=arm64 go build -ldflags="$(LDFLAGS)" -o build/gozen-linux-arm64 + cp build/gozen-linux-arm64 build/gozen + tar -zcvf build/gozen-linux-arm64.tar.gz build/gozen-linux-arm64 man/gozen.1 + GOOS=linux GOARCH=arm go build -ldflags="$(LDFLAGS)" -o build/gozen-linux-arm + cp build/gozen-linux-arm build/gozen + tar -zcvf build/gozen-linux-arm.tar.gz build/gozen-linux-arm man/gozen.1 + GOOS=darwin GOARCH=amd64 go build -ldflags="$(LDFLAGS)" -o build/gozen-darwin-amd64 + cp build/gozen-darwin-amd64 build/gozen + tar -zcvf build/gozen-darwin-amd64.tar.gz build/gozen-darwin-amd64 man/gozen.1 + GOOS=darwin GOARCH=arm64 go build -ldflags="$(LDFLAGS)" -o build/gozen-darwin-arm64 + cp build/gozen-darwin-arm64 build/gozen + tar -zcvf build/gozen-darwin-arm64.tar.gz build/gozen-darwin-arm64 man/gozen.1 + rm build/gozen + GOOS=windows GOARCH=amd64 go build -ldflags="$(LDFLAGS)" -o build/gozen-windows-amd64.exe + GOOS=windows GOARCH=386 go build -ldflags="$(LDFLAGS)" -o build/gozen-windows-i386.exe clean: rm -rf gozen* - rm -rf build \ No newline at end of file + rm -rf build diff --git a/cmd/create_app.go b/cmd/create_app.go index 0774d8f..4917b02 100644 --- a/cmd/create_app.go +++ b/cmd/create_app.go @@ -30,6 +30,18 @@ func (cmd *appCmd) CreateApp() error { // Generating basic codes cmd.helper.Write("templates/env.sample.tpl", appPath+"/.env", cmd.project) cmd.helper.Write("templates/env.sample.tpl", appPath+"/.env.sample", cmd.project) + cmd.helper.Write("templates/env.sample.tpl", appPath+"/docker/.env", cmd.project) + cmd.helper.Write("templates/env.sample.tpl", appPath+"/docker/.env.sample", cmd.project) + cmd.helper.Write("templates/docker/Dockerfile.debug", appPath+"/docker/Dockerfile.debug", cmd.project) + cmd.helper.Write("templates/docker/Dockerfile.dev", appPath+"/docker/Dockerfile.dev", cmd.project) + cmd.helper.Write("templates/docker/Dockerfile.prod", appPath+"/docker/Dockerfile.prod", cmd.project) + cmd.helper.Write("templates/docker/docker-compose-debug.yml", appPath+"/docker/docker-compose-debug.yml", cmd.project) + cmd.helper.Write("templates/docker/docker-compose.yml", appPath+"/docker/docker-compose.yml", cmd.project) + cmd.helper.Write("templates/docker/entrypoint-debug.sh", appPath+"/docker/entrypoint-debug.sh", cmd.project) + cmd.helper.Write("templates/docker/entrypoint-dev.sh", appPath+"/docker/entrypoint-dev.sh", cmd.project) + cmd.helper.Write("templates/docker/modd-debug.conf", appPath+"/docker/modd-debug.conf", cmd.project) + cmd.helper.Write("templates/docker/modd-dev.conf", appPath+"/docker/modd-dev.conf", cmd.project) + cmd.helper.Write("templates/gitignore.tpl", appPath+"/.gitignore", cmd.project) cmd.helper.Write("templates/Makefile.tpl", appPath+"/Makefile", cmd.project) cmd.helper.Write("templates/go.tpl", appPath+"/go.mod", cmd.project) diff --git a/main.go b/main.go index d2bcbb0..24063be 100644 --- a/main.go +++ b/main.go @@ -10,6 +10,12 @@ import ( "github.com/urfave/cli/v2" ) +var ( + AppVersion = "v0.0.0" + CommitHash = "unknown" + BuildDate = "unknown" +) + //go:embed templates/* var templatesFS embed.FS @@ -24,6 +30,7 @@ func main() { clientApp := cli.NewApp() clientApp.Name = "gozen" + clientApp.Version = AppVersion clientApp.Commands = []*cli.Command{ { Name: "create", diff --git a/templates/Makefile.tpl b/templates/Makefile.tpl index 57fb9cf..2e2c02d 100644 --- a/templates/Makefile.tpl +++ b/templates/Makefile.tpl @@ -3,7 +3,7 @@ test: go test -v ./... -race -coverprofile=coverage.out -covermode=atomic -install: +setup: go mod tidy run: diff --git a/templates/docker/Dockerfile.debug b/templates/docker/Dockerfile.debug new file mode 100644 index 0000000..02ffbb3 --- /dev/null +++ b/templates/docker/Dockerfile.debug @@ -0,0 +1,18 @@ +FROM golang:1.22 + +RUN apt-get update && \ + apt-get install -y \ + apt-transport-https \ + ca-certificates \ + curl \ + gnupg-agent + +RUN curl -sSL https://packagecloud.io/golang-migrate/migrate/gpgkey | apt-key add - +RUN echo "deb https://packagecloud.io/golang-migrate/migrate/ubuntu/ bionic main" > /etc/apt/sources.list.d/migrate.list +RUN apt-get update && \ + apt-get install -y migrate + + +WORKDIR /app + +ENTRYPOINT ["bash", "docker/entrypoint-dev.sh"] diff --git a/templates/docker/Dockerfile.dev b/templates/docker/Dockerfile.dev new file mode 100644 index 0000000..02ffbb3 --- /dev/null +++ b/templates/docker/Dockerfile.dev @@ -0,0 +1,18 @@ +FROM golang:1.22 + +RUN apt-get update && \ + apt-get install -y \ + apt-transport-https \ + ca-certificates \ + curl \ + gnupg-agent + +RUN curl -sSL https://packagecloud.io/golang-migrate/migrate/gpgkey | apt-key add - +RUN echo "deb https://packagecloud.io/golang-migrate/migrate/ubuntu/ bionic main" > /etc/apt/sources.list.d/migrate.list +RUN apt-get update && \ + apt-get install -y migrate + + +WORKDIR /app + +ENTRYPOINT ["bash", "docker/entrypoint-dev.sh"] diff --git a/templates/docker/Dockerfile.prod b/templates/docker/Dockerfile.prod new file mode 100644 index 0000000..57d868a --- /dev/null +++ b/templates/docker/Dockerfile.prod @@ -0,0 +1,16 @@ +# Builder stage +FROM golang:1.22 as builder + +WORKDIR /src +ADD . . +RUN go build -o app . + +# Runner Stage +FROM alpine:edge +RUN apk add --no-cache libc6-compat +RUN apk add --no-cache tzdata +RUN mkdir /app +WORKDIR /app +COPY --from=builder /src/app /app/app +CMD ["/app/app", "start"] +EXPOSE 3000 diff --git a/templates/docker/docker-compose-debug.yml b/templates/docker/docker-compose-debug.yml new file mode 100644 index 0000000..06d8096 --- /dev/null +++ b/templates/docker/docker-compose-debug.yml @@ -0,0 +1,35 @@ +version: "3" +services: + app: + networks: + - app + build: + context: . + dockerfile: Dockerfile.debug + container_name: app + security_opt: + - seccomp:unconfined + env_file: .env + ports: + - "2345:2345" + - "3000:3000" + volumes: + - "../:/app" + + # app-workers: + # networks: + # - app + # build: + # context: . + # dockerfile: Dockerfile.Workers + # container_name: app-workers + # security_opt: + # - seccomp:unconfined + # env_file: .env + # volumes: + # - "../:/app" + # depends_on: + # - app + +networks: + app: diff --git a/templates/docker/docker-compose.yml b/templates/docker/docker-compose.yml new file mode 100644 index 0000000..de15864 --- /dev/null +++ b/templates/docker/docker-compose.yml @@ -0,0 +1,34 @@ +version: "3" +services: + app: + networks: + - app + build: + context: . + dockerfile: Dockerfile.dev + container_name: app + security_opt: + - seccomp:unconfined + env_file: .env + ports: + - "3000:3000" + volumes: + - "../:/app" + + # app-workers: + # networks: + # - app + # build: + # context: . + # dockerfile: Dockerfile.Workers + # container_name: app-workers + # security_opt: + # - seccomp:unconfined + # env_file: .env + # volumes: + # - "../:/app" + # depends_on: + # - app + +networks: + app: diff --git a/templates/docker/entrypoint-debug.sh b/templates/docker/entrypoint-debug.sh new file mode 100755 index 0000000..cfe5317 --- /dev/null +++ b/templates/docker/entrypoint-debug.sh @@ -0,0 +1,18 @@ +#!/bin/bash +cd .. +go get -u github.com/go-delve/delve/cmd/dlv +cd - +MODD_DIR=modd +cd docker +if [ ! -d "$MODD_DIR" ]; then + git clone https://github.com/cortesi/modd + git checkout 45e41bb091af8d3c7bfdc523851a9fc993df8a80 + cd modd + go get mvdan.cc/sh@8aeb0734cd0f + cd - +fi +cd modd +go install ./cmd/modd +cd - +cd .. +modd -f ./docker/modd-debug.conf diff --git a/templates/docker/entrypoint-dev.sh b/templates/docker/entrypoint-dev.sh new file mode 100644 index 0000000..dd6ed49 --- /dev/null +++ b/templates/docker/entrypoint-dev.sh @@ -0,0 +1,15 @@ +#!/bin/bash +MODD_DIR=modd +cd docker +if [ ! -d "$MODD_DIR" ]; then + git clone https://github.com/cortesi/modd + git checkout 45e41bb091af8d3c7bfdc523851a9fc993df8a80 + cd modd + go get mvdan.cc/sh@8aeb0734cd0f + cd - +fi +cd modd +go install ./cmd/modd +cd - +cd .. +modd -f ./docker/modd-dev.conf diff --git a/templates/docker/modd-debug.conf b/templates/docker/modd-debug.conf new file mode 100644 index 0000000..a297a7a --- /dev/null +++ b/templates/docker/modd-debug.conf @@ -0,0 +1,9 @@ +**/*.go { + # Server Configurations + prep: if pgrep $APP_NAME; then pkill $APP_NAME; fi + prep: if pgrep dlv; then pkill dlv; fi + prep: go mod tidy + prep: go build -gcflags="-N -l" -o $APP_NAME ./*.go + daemon: ./$APP_NAME start + daemon: dlv attach --headless=true --listen=:2345 --api-version=2 $(pidof $BIN_NAME) +} diff --git a/templates/docker/modd-dev.conf b/templates/docker/modd-dev.conf new file mode 100644 index 0000000..0b8f496 --- /dev/null +++ b/templates/docker/modd-dev.conf @@ -0,0 +1,7 @@ +**/*.go { + # Server Configurations + prep: if pgrep $APP_NAME; then pkill $APP_NAME; fi + prep: go mod tidy + prep: go build -gcflags="-N -l" -o $APP_NAME ./*.go + daemon: ./$APP_NAME start +} diff --git a/templates/gitignore.tpl b/templates/gitignore.tpl index cc1c09f..a51d3b0 100644 --- a/templates/gitignore.tpl +++ b/templates/gitignore.tpl @@ -2,3 +2,4 @@ {{.AppName}}.exe .env .db +modd/ \ No newline at end of file