feat: init taskfile, docker-compose, env
This commit is contained in:
6
.env.dist
Normal file
6
.env.dist
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
COMPOSE_PROJECT_NAME=h-skills
|
||||||
|
ALPINE_VER=3.19
|
||||||
|
GOVERTER_VER=v1.4.0
|
||||||
|
GOLANGCI_LINT_VER=v1.56.2
|
||||||
|
POSTGRES_VER=16.2
|
||||||
|
AIR_VER=1.52.0
|
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
/.task
|
||||||
|
/.env
|
||||||
|
/bin/env
|
||||||
|
/tmp/
|
2
.golangci.yml
Normal file
2
.golangci.yml
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
# golangci-lint configuration file.
|
||||||
|
# Read more at: https://github.com/golangci/golangci-lint#config-file
|
20
Dockerfile
Normal file
20
Dockerfile
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
ARG POSTGRES_VER
|
||||||
|
ARG GO_VER
|
||||||
|
ARG ALPINE_VER
|
||||||
|
|
||||||
|
FROM postgres:${POSTGRES_VER} AS postgres
|
||||||
|
|
||||||
|
COPY ./db/* /docker-entrypoint-initdb.d/
|
||||||
|
|
||||||
|
RUN set -ex \
|
||||||
|
&& chmod 1777 /tmp
|
||||||
|
|
||||||
|
FROM golang:${GO_VER}-alpine${ALPINE_VER} AS golang
|
||||||
|
|
||||||
|
ARG AIR_VER
|
||||||
|
RUN set -ex \
|
||||||
|
&& chmod 1777 /tmp \
|
||||||
|
&& apk add --no-cache \
|
||||||
|
git \
|
||||||
|
tzdata \
|
||||||
|
&& go install github.com/cosmtrek/air@v${AIR_VER}
|
129
Taskfile.go.yaml
Normal file
129
Taskfile.go.yaml
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
version: '3'
|
||||||
|
|
||||||
|
vars:
|
||||||
|
GOFUMPT_VER: '{{.GOFUMPT_VER | default "latest"}}'
|
||||||
|
GOIMPORTS_LOCAL: '{{.GOIMPORTS_LOCAL | default nil}}'
|
||||||
|
GOIMPORT_VER: '{{.GOIMPORT_VER | default "latest"}}'
|
||||||
|
GOLANGCI_LINT_VER: '{{.GOLANGCI_LINT_VER | default "latest"}}'
|
||||||
|
GOVULNCHECK_VER: '{{.GOVULNCHECK_VER | default "latest"}}'
|
||||||
|
PROTOLINT_VER: '{{.PROTOLINT_VER | default "latest"}}'
|
||||||
|
STATICCHECK_VER: '{{.STATICCHECK_VER | default "latest"}}'
|
||||||
|
TMP_DIR: '{{.TMP_DIR | default "./tmp"}}'
|
||||||
|
|
||||||
|
tasks:
|
||||||
|
# =======
|
||||||
|
# HELPERS
|
||||||
|
# =======
|
||||||
|
|
||||||
|
lint:
|
||||||
|
desc: golangci-lint + protolint.
|
||||||
|
cmds:
|
||||||
|
- task: govulncheck
|
||||||
|
- task: staticcheck
|
||||||
|
- task: golangci-lint
|
||||||
|
- task: protolint
|
||||||
|
|
||||||
|
cs:
|
||||||
|
desc: fmt + goimports.
|
||||||
|
cmds:
|
||||||
|
- task: fmt
|
||||||
|
- task: goimports
|
||||||
|
|
||||||
|
# ===============
|
||||||
|
# QUALITY CONTROL
|
||||||
|
# ===============
|
||||||
|
|
||||||
|
fmt:
|
||||||
|
desc: format code using gofumpt.
|
||||||
|
cmds:
|
||||||
|
- >-
|
||||||
|
go run mvdan.cc/gofumpt@{{.GOFUMPT_VER}} -l -w .
|
||||||
|
sources:
|
||||||
|
- ./**/*.go
|
||||||
|
|
||||||
|
goimports:
|
||||||
|
desc: format imports using goimports.
|
||||||
|
cmds:
|
||||||
|
- >-
|
||||||
|
go run golang.org/x/tools/cmd/goimports@{{.GOIMPORT_VER}}
|
||||||
|
{{if .GOIMPORTS_LOCAL}} -local="{{.GOIMPORTS_LOCAL}}"{{end}}
|
||||||
|
-w .
|
||||||
|
sources:
|
||||||
|
- ./**/*.go
|
||||||
|
|
||||||
|
tidy:
|
||||||
|
desc: go mod tidy + go mod verify.
|
||||||
|
cmds:
|
||||||
|
- go mod tidy -v
|
||||||
|
- go mod verify
|
||||||
|
sources:
|
||||||
|
- ./**/*.go
|
||||||
|
- go.mod
|
||||||
|
- go.sum
|
||||||
|
|
||||||
|
golangci-lint:
|
||||||
|
desc: golangci-lint.
|
||||||
|
cmds:
|
||||||
|
- go run github.com/golangci/golangci-lint/cmd/golangci-lint@{{.GOLANGCI_LINT_VER}} run -v ./...
|
||||||
|
sources:
|
||||||
|
- ./**/*.go
|
||||||
|
|
||||||
|
govulncheck:
|
||||||
|
desc: govulncheck.
|
||||||
|
cmds:
|
||||||
|
- go run golang.org/x/vuln/cmd/govulncheck@{{.GOVULNCHECK_VER}} ./...
|
||||||
|
sources:
|
||||||
|
- ./**/*.go
|
||||||
|
|
||||||
|
staticcheck:
|
||||||
|
desc: staticcheck.
|
||||||
|
cmds:
|
||||||
|
- go run honnef.co/go/tools/cmd/staticcheck@{{.STATICCHECK_VER}} -checks=all,-ST1000 ./...
|
||||||
|
sources:
|
||||||
|
- ./**/*.go
|
||||||
|
|
||||||
|
protolint:
|
||||||
|
desc: protolint -fix.
|
||||||
|
cmds:
|
||||||
|
- cmd: go run github.com/yoheimuta/protolint/cmd/protolint@{{.PROTOLINT_VER}} lint -fix .
|
||||||
|
ignore_error: true
|
||||||
|
sources: &protolint_sources
|
||||||
|
- ./**/*.proto
|
||||||
|
|
||||||
|
protolint:check:
|
||||||
|
desc: protolint check.
|
||||||
|
cmds:
|
||||||
|
- go run github.com/yoheimuta/protolint/cmd/protolint@{{.PROTOLINT_VER}} lint .
|
||||||
|
sources: *protolint_sources
|
||||||
|
|
||||||
|
# ===========
|
||||||
|
# DEVELOPMENT
|
||||||
|
# ===========
|
||||||
|
|
||||||
|
generate:
|
||||||
|
desc: go generate
|
||||||
|
cmds:
|
||||||
|
- go generate ./...
|
||||||
|
sources:
|
||||||
|
- ./**/*.go
|
||||||
|
|
||||||
|
vendor:
|
||||||
|
desc: go mod vendor.
|
||||||
|
cmds:
|
||||||
|
- go mod vendor -v
|
||||||
|
sources:
|
||||||
|
- go.mod
|
||||||
|
- go.sum
|
||||||
|
generates:
|
||||||
|
- vendor
|
||||||
|
|
||||||
|
test:
|
||||||
|
desc: go tests ./...
|
||||||
|
cmds:
|
||||||
|
- go test -race -buildvcs -coverprofile={{.TMP_DIR}}/coverage.out -vet=off ./...
|
||||||
|
|
||||||
|
test:cover:
|
||||||
|
desc: tests and display coverage.
|
||||||
|
deps: [ test ]
|
||||||
|
cmds:
|
||||||
|
- go tool cover -html={{.TMP_DIR}}/coverage.out
|
181
Taskfile.yaml
Normal file
181
Taskfile.yaml
Normal file
@ -0,0 +1,181 @@
|
|||||||
|
version: '3'
|
||||||
|
|
||||||
|
includes:
|
||||||
|
go:
|
||||||
|
taskfile: ./Taskfile.go.yaml
|
||||||
|
|
||||||
|
output: prefixed
|
||||||
|
|
||||||
|
silent: true
|
||||||
|
interval: 1s
|
||||||
|
|
||||||
|
dotenv:
|
||||||
|
- ./.env
|
||||||
|
|
||||||
|
vars:
|
||||||
|
NEWLINE_EXCLUDE: >-
|
||||||
|
-not -path "./.git/*"
|
||||||
|
-not -path "./.idea/*"
|
||||||
|
-not -path "./vendor/*"
|
||||||
|
-not -path "./tmp/*"
|
||||||
|
-not -name "*.ico"
|
||||||
|
-not -name "*.png"
|
||||||
|
-not -name "*.svg"
|
||||||
|
|
||||||
|
tasks:
|
||||||
|
# =======
|
||||||
|
# HELPERS
|
||||||
|
# =======
|
||||||
|
|
||||||
|
all:
|
||||||
|
desc: generate + tidy + lint + test.
|
||||||
|
cmds:
|
||||||
|
- task: generate
|
||||||
|
- task: go:tidy
|
||||||
|
- task: go:lint
|
||||||
|
- task: go:test
|
||||||
|
|
||||||
|
generate:
|
||||||
|
desc: all generators + cs.
|
||||||
|
cmds:
|
||||||
|
- task: goverter
|
||||||
|
- task: go:generate
|
||||||
|
- task: cs
|
||||||
|
|
||||||
|
cs:
|
||||||
|
desc: go:cs + newline.
|
||||||
|
cmds:
|
||||||
|
- task: go:cs
|
||||||
|
- task: newline
|
||||||
|
|
||||||
|
# ===============
|
||||||
|
# QUALITY CONTROL
|
||||||
|
# ===============
|
||||||
|
|
||||||
|
newline:
|
||||||
|
desc: add newline at end file.
|
||||||
|
cmds:
|
||||||
|
- >-
|
||||||
|
find .
|
||||||
|
{{.NEWLINE_EXCLUDE}}
|
||||||
|
-type f -exec grep -Iq . {} \; -and -print0
|
||||||
|
| xargs -0 -n 1 sh -c 'test -z "$(tail -c 1 "$0")"
|
||||||
|
|| (echo "" >> $0 && echo $0)'
|
||||||
|
|| exit 1
|
||||||
|
sources: &newline_sources
|
||||||
|
- ./**/*
|
||||||
|
- exclude: "*.ico"
|
||||||
|
- exclude: "*.png"
|
||||||
|
- exclude: "*.svg"
|
||||||
|
|
||||||
|
newline:check:
|
||||||
|
desc: check newline at end file.
|
||||||
|
cmds:
|
||||||
|
- find .
|
||||||
|
{{.NEWLINE_EXCLUDE}}
|
||||||
|
-type f -exec grep -Iq . {} \; -and -print0
|
||||||
|
| xargs -0 -n 1 sh -c 'test -z "$(tail -c 1 "$0")"
|
||||||
|
|| (echo "No new line at end of $0" && exit 1)'
|
||||||
|
|| exit 1
|
||||||
|
sources: *newline_sources
|
||||||
|
|
||||||
|
# ===========
|
||||||
|
# DEVELOPMENT
|
||||||
|
# ===========
|
||||||
|
|
||||||
|
dotenv:install:
|
||||||
|
internal: true
|
||||||
|
cmds:
|
||||||
|
- mkdir -p bin
|
||||||
|
- curl -o bin/env https://raw.githubusercontent.com/bashup/dotenv/master/dotenv
|
||||||
|
- chmod +x bin/env
|
||||||
|
status:
|
||||||
|
- test -f bin/env
|
||||||
|
|
||||||
|
dotenv:
|
||||||
|
deps: [ dotenv:install ]
|
||||||
|
desc: fill .env file.
|
||||||
|
vars:
|
||||||
|
UID:
|
||||||
|
sh: id -u
|
||||||
|
GID:
|
||||||
|
sh: id -g
|
||||||
|
GO_VER:
|
||||||
|
sh: go mod edit -json | jq -r .Go
|
||||||
|
GOIMPORTS_LOCAL:
|
||||||
|
sh: go list -m | awk -F/ '{print $1}'
|
||||||
|
ENV_DIST:
|
||||||
|
sh: cat .env.dist|tr '\n' ' '
|
||||||
|
GOPATH:
|
||||||
|
sh: go env GOPATH
|
||||||
|
cmds:
|
||||||
|
- bin/env set GROUP_ID={{.UID}} USER_ID={{.GID}} GO_VER={{.GO_VER}} GOPATH={{.GOPATH}} {{.ENV_DIST}}
|
||||||
|
sources:
|
||||||
|
- .env.dist
|
||||||
|
- Taskfile.yaml
|
||||||
|
generates:
|
||||||
|
- .env
|
||||||
|
|
||||||
|
goverter:
|
||||||
|
desc: go run goverter
|
||||||
|
deps: [ dotenv ]
|
||||||
|
cmds:
|
||||||
|
- go run github.com/jmattheis/goverter/cmd/goverter@{{.GOVERTER_VER}} gen ./...
|
||||||
|
sources:
|
||||||
|
- ./**/*.go
|
||||||
|
|
||||||
|
# =========
|
||||||
|
# OPERATION
|
||||||
|
# =========
|
||||||
|
|
||||||
|
up:
|
||||||
|
desc: up all services.
|
||||||
|
cmds:
|
||||||
|
- task: postgres:up
|
||||||
|
- task: api:up
|
||||||
|
|
||||||
|
down:
|
||||||
|
desc: docker compose down.
|
||||||
|
deps: [ dotenv ]
|
||||||
|
cmds:
|
||||||
|
- docker compose down -v --remove-orphans
|
||||||
|
|
||||||
|
postgres:build:
|
||||||
|
internal: true
|
||||||
|
desc: docker compose build postgres.
|
||||||
|
deps: [ dotenv ]
|
||||||
|
cmds:
|
||||||
|
- docker compose build postgres
|
||||||
|
sources:
|
||||||
|
- db/**/*
|
||||||
|
- Dockerfile
|
||||||
|
- docker-compose.yml
|
||||||
|
|
||||||
|
postgres:up:
|
||||||
|
desc: docker compose up postgres.
|
||||||
|
deps: [ dotenv, postgres:build ]
|
||||||
|
cmds:
|
||||||
|
- docker compose up -d --force-recreate postgres
|
||||||
|
|
||||||
|
postgres:push:
|
||||||
|
desc: docker compose push postgres.
|
||||||
|
deps: [ dotenv, postgres:build ]
|
||||||
|
cmds:
|
||||||
|
- docker compose push postgres
|
||||||
|
|
||||||
|
api:build:
|
||||||
|
internal: true
|
||||||
|
desc: docker compose build api image.
|
||||||
|
deps: [ dotenv ]
|
||||||
|
cmds:
|
||||||
|
- docker compose build api
|
||||||
|
sources:
|
||||||
|
- .env
|
||||||
|
- Dockerfile
|
||||||
|
- docker-compose.yml
|
||||||
|
|
||||||
|
api:up:
|
||||||
|
desc: docker compose up api.
|
||||||
|
deps: [ dotenv, api:build ]
|
||||||
|
cmds:
|
||||||
|
- docker compose up -d --force-recreate api
|
0
db/.gitkeep
Normal file
0
db/.gitkeep
Normal file
41
docker-compose.yml
Normal file
41
docker-compose.yml
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
services:
|
||||||
|
postgres:
|
||||||
|
build:
|
||||||
|
target: postgres
|
||||||
|
context: .
|
||||||
|
args: &args
|
||||||
|
AIR_VER: ${AIR_VER}
|
||||||
|
ALPINE_VER: ${ALPINE_VER}
|
||||||
|
GO_VER: ${GO_VER}
|
||||||
|
POSTGRES_VER: ${POSTGRES_VER}
|
||||||
|
image: harbor.grachevko.ru/grachevko/h-skills/postgres:dev
|
||||||
|
labels:
|
||||||
|
ru.grachevko.dhu: 'postgres.h-skills.local'
|
||||||
|
environment:
|
||||||
|
POSTGRES_DB: postgres
|
||||||
|
POSTGRES_USER: postgres
|
||||||
|
POSTGRES_PASSWORD: postgres
|
||||||
|
PGDATABASE: postgres
|
||||||
|
PGUSER: postgres
|
||||||
|
PGPASSWORD: postgres
|
||||||
|
volumes:
|
||||||
|
- type: tmpfs
|
||||||
|
target: /var/lib/postgresql/data
|
||||||
|
tmpfs:
|
||||||
|
size: 4294967296
|
||||||
|
|
||||||
|
api:
|
||||||
|
build:
|
||||||
|
target: golang
|
||||||
|
args: *args
|
||||||
|
command: air --build.cmd "go build -o ./tmp/api ./cmd/api/" --build.bin "./tmp/api"
|
||||||
|
labels:
|
||||||
|
ru.grachevko.dhu: 'api.h-skills.local'
|
||||||
|
environment:
|
||||||
|
GOPATH: ${GOPATH}
|
||||||
|
working_dir: /app
|
||||||
|
volumes:
|
||||||
|
- ./:/app
|
||||||
|
- ${GOPATH}:${GOPATH}
|
||||||
|
- ${HOME}/.cache/go-build:/.cache/go-build
|
||||||
|
user: ${USER_ID}:${GROUP_ID}
|
Reference in New Issue
Block a user