summary refs log tree commit diff
path: root/.config/yamlfs/go.yml
blob: 82f57fee8997aa75a044859371b26e33dbea35a0 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
{% $goversion := 1.14 %}
{% $gopkg := (printf "example.com/%s" .name) %}
{% with .pkg %}{% $gopkg = . %}{% end %}
cmd:
  {% .name %}:
    main.go: |
      package main

      func main() {
        println("hello world")
      }

version:
  version.go: |
    package version

    var (
    	Version = "0.0.0+unknown"
    	Revision = ""
    )

go.mod: |
  module {% $gopkg %}

  go {% $goversion %}

Dockerfile: |
  #syntax=docker/dockerfile:experimental

  FROM docker.io/library/golang:{% $goversion %}-alpine AS base
  RUN apk add -U --no-cache \
      ca-certificates

  FROM base AS build
  WORKDIR /src
  RUN --mount=target=/src,rw \
      --mount=type=cache,target=/go/pkg \
      --mount=type=cache,target=/root/.cache/go-build \
      make all

  FROM base AS run
  COPY --from=dev /src/{% .name %} /usr/local/bin/
  ENTRYPOINT [ "{% .name %}" ]

  FROM scratch AS final
  COPY --from=build /src/{% .name %} /

Makefile: |
  .POSIX:

  all: validate test {% .name %}

  GO ?= go
  GO_PKG ?= {% $gopkg %}
  GO_BUILDTAGS ?= netgo osusergo static_build
  GO_LDFLAGS ?= -s -w -extldflags "-static"

  VERSION ?= $(shell git describe --match 'v[0-9]*' --dirty='+dev' --always --tags)
  REVISION ?= $(shell git rev-parse HEAD)
  GO_VERSIONFLAGS = -X {% $gopkg %}/version.Version=$(VERSION) -X {% $gopkg %}/version.Revision=$(REVISION)

  build: {% .name %}
  {% .name %}:
  	$(GO) build \
  		-tags '$(GO_BUILDTAGS)' -ldflags '$(GO_LDFLAGS) $(GO_VERSIONFLAGS)' \
  		-o {% .name %} \
  		./cmd/{% .name %}

  RM ?= rm -f

  clean:
  	$(RM) {% .name %}

  container-build:
  	DOCKER_BUILDKIT=1 \
  	docker build --target final -o . .

  GOLANGCI_LINT ?= golangci-lint
  validate:
  	$(GOLANGCI_LINT) run --build-tags "$(GO_BUILDTAGS)"

  GOTEST_FLAGS ?=
  ifneq ($(shell which gotestsum),)
  GOTEST ?= gotestsum --format=testname --
  else
  GOTEST ?= go test
  endif
  test:
  	$(GOTEST) \
  		-tags '$(GO_BUILDTAGS)' \
  		-cover \
  		-covermode=atomic \
  		$(GOTEST_FLAGS)

  .PHONY: all build clean container-build test validate

.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