summary refs log tree commit diff
path: root/.config/yamlfs/go-full.yaml
diff options
context:
space:
mode:
authorRobert Günzler <r@gnzler.io>2021-02-23 13:38:09 +0100
committerRobert Günzler <r@gnzler.io>2021-04-26 02:09:46 +0200
commit0bc5b4da3f6b41ae1dad3e3fec1dae10351308f1 (patch)
tree72a776f7a3af8d90b62d2f4ae5bee84a1feb644b /.config/yamlfs/go-full.yaml
parent9ee88b40546a26b2ea6f0bbb93baccb793907361 (diff)
yamlfs: create simpler go template
* old go is go-full and needs a revamp
* removed docker from meson
Diffstat (limited to '.config/yamlfs/go-full.yaml')
-rw-r--r--.config/yamlfs/go-full.yaml193
1 files changed, 193 insertions, 0 deletions
diff --git a/.config/yamlfs/go-full.yaml b/.config/yamlfs/go-full.yaml
new file mode 100644
index 0000000..21fb36d
--- /dev/null
+++ b/.config/yamlfs/go-full.yaml
@@ -0,0 +1,193 @@
+{% $goversion := 1.15 %}
+cmd:
+  {% .name %}:
+    main.go: |
+      package main
+
+      func main() {
+        println("hello world")
+      }
+
+version:
+  version.go: |
+    package version
+
+    var (
+    	Package = "{% .gopkg %}"
+    	Revision = ""
+    	Version = "0.0.0+unknown"
+    )
+
+go.mod: |
+  module {% .gopkg %}
+
+  go {% $goversion %}
+
+Dockerfile: |
+  # syntax=docker/dockerfile:1.1-experimental
+  # vim: ft=dockerfile
+
+  ARG GO_VERSION={% $goversion %}
+
+  FROM --platform=${BUILDPLATFORM:?err} docker.io/tonistiigi/xx:golang AS xx
+  FROM --platform=${BUILDPLATFORM:?err} docker.io/library/golang:${GO_VERSION:?err}-alpine AS buildenv
+  COPY --from=xx / /
+  ARG TARGETPLATFORM
+  WORKDIR /src
+  RUN apk --update-cache --no-cache add make
+
+  FROM buildenv AS gotestsum
+  RUN go get gotest.tools/gotestsum@0.6.0
+
+  FROM buildenv AS golangcilint
+  RUN go get github.com/golangci/golangci-lint/cmd/golangci-lint@v1.27.0
+
+  FROM buildenv AS test
+  COPY --from=gotestsum /go/bin/gotestsum /usr/local/bin/
+  COPY --from=golangcilint /go/bin/golangci-lint /usr/local/bin/
+  RUN --mount=target=/src,rw \
+      --mount=type=cache,target=/go/pkg \
+      --mount=type=cache,target=/root/.cache \
+      make DESTDIR=/out clean validate test
+
+  FROM buildenv AS build
+  RUN --mount=target=/src,rw \
+      --mount=type=cache,target=/go/pkg \
+      --mount=type=cache,target=/root/.cache \
+      make DESTDIR=/out clean build
+
+  FROM scratch AS final
+  COPY --from=build /out/{% .name %} /
+
+  FROM --platform=${TARGETPLATFORM:?err} docker.io/library/alpine:3.11 AS runtime-base
+  RUN apk --update-cache --no-cache add ca-certificates
+
+  FROM runtime-base AS run
+  COPY --from=build /out/{% .name %} /usr/local/bin/
+  ENTRYPOINT [ "{% .name %}" ]
+
+Makefile: |
+  .POSIX:
+
+  all: validate test {% .name %}
+
+  DESTDIR  ?= .
+  PREFIX   ?=
+  VERSION  ?= $(shell git describe --match 'v[0-9]*' --dirty='+dev' --always --tags)
+  REVISION ?= $(shell git rev-parse HEAD)
+
+  GO ?= go
+  GO_PKG ?= {% .gopkg %}
+  GO_BUILDTAGS ?= netgo osusergo static_build
+  GO_LDFLAGS ?= -s -w -extldflags "-static"
+  GO_VERSIONFLAGS = -X $(GO_PKG)/version.Version=$(VERSION) -X $(GO_PKG)/version.Revision=$(REVISION)
+
+  .PHONY: build
+  build: {% .name %}
+  {% .name %}:
+  	$(GO) build \
+  		-tags '$(GO_BUILDTAGS)' -ldflags '$(GO_LDFLAGS) $(GO_VERSIONFLAGS)' \
+  		-o $(DESTDIR)$(PREFIX)/{% .name %} \
+  		./cmd/{% .name %}
+
+  PLATFORM ?= linux/amd64
+  REPO ?= {% .name %}
+  TAG ?= $(VERSION)
+
+  .PHONY: container-build
+  container-build:
+  	DOCKER_BUILDKIT=1 \
+  	docker build --platform $(PLATFORM) --target final -o . .
+
+  .PHONY: container-test
+  container-test:
+  	DOCKER_BUILDKIT=1 \
+  	docker build --platform $(PLATFORM) --target test -o type=tar,dest=/dev/null .
+
+  .PHONY: container-image
+  container-image:
+  	DOCKER_BUILDKIT=1 \
+  	docker build --platform $(PLATFORM) --target run -t $(REPO):$(TAG) .
+
+  .PHONY: cross
+  cross:
+  	docker run --rm -it --privileged \
+  		--mount type=bind,src=$(PWD),dst=/src \
+  		--entrypoint buildctl-daemonless.sh \
+  		moby/buildkit:latest \
+  			buildctl build --frontend=dockerfile.v0 \
+  			--local context=/src --local dockerfile=/src \
+  			--opt filename=Dockerfile \
+  			--opt platform=$(PLATFORM) \
+  			--opt target=run \
+  			--output type=image,name=$(REPO):$(TAG),push=true
+
+  GOLANGCI_LINT ?= golangci-lint
+
+  .PHONY: validate
+  validate:
+  	$(GOLANGCI_LINT) run --build-tags "$(GO_BUILDTAGS)"
+
+  GOTEST_FLAGS ?=
+  ifneq ($(shell which gotestsum),)
+  GOTEST ?= gotestsum --format=testname --
+  else
+  GOTEST ?= go test
+  endif
+
+  .PHONY: test
+  test:
+  	$(GOTEST) \
+  		-tags '$(GO_BUILDTAGS)' \
+  		-cover \
+  		-covermode=atomic \
+  		$(GOTEST_FLAGS)
+
+  RM ?= rm -f
+
+  .PHONY: clean
+  clean:
+  	$(RM) {% .name %}
+
+  .PHONY: help
+  help:
+  	@printf "usage:\n"
+  	@printf "\n"
+  	@printf "  build             local build\n"
+  	@printf "  validate          linter\n"
+  	@printf "  test              tests\n"
+  	@printf "  container-build   build w/ docker\n"
+  	@printf "  container-image   image build\n"
+  	@printf "  cross             build w/ buildkit (multi-platform support)\n"
+  	@printf "\n"
+  	@printf "  DESTDIR, PREFIX   output location (default: $(DESTDIR)/$(PREFIX))\n"
+  	@printf "  PLATFORM          output platform (default: $(PLATFORM))\n"
+  	@printf "  REPO, TAG         image repository:tag (default: $(REPO):$(TAG))\n"
+  	@printf "\n"
+
+.editorconfig: |
+  ; http://editorconfig.org/
+
+  root = true
+
+  [*]
+  insert_final_newline = true
+  charset = utf-8
+  trim_trailing_whitespace = true
+  indent_style = space
+  indent_size = 2
+
+  [{Makefile,go.mod,go.sum,*go}]
+  indent_style = tab
+  indent_size = 8
+
+  [*.md]
+  trim_trailing_whitespace = false
+
+  [Dockerfile]
+  indent_size = 4
+
+README.md: |
+  # {% .name %}
+
+  TODO