-
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathmagefile.go
150 lines (122 loc) · 3.11 KB
/
magefile.go
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
//go:build mage
// +build mage
package main
import (
"fmt"
"os"
"github.com/magefile/mage/sh"
)
// BinaryName ...
var BinaryName = "dns"
// DockerRegistry ...
var DockerRegistry = "mxssl"
// Build the app
func Build() error {
if err := sh.Run("go", "build", "-v", "-o", BinaryName); err != nil {
return err
}
fmt.Printf("%s is successfully built\n", BinaryName)
return nil
}
// Lint the app
func Lint() error {
if err := sh.RunV("golangci-lint", "run"); err != nil {
return err
}
return nil
}
// Clean delete compiled binary
func Clean() error {
if !fileExists(BinaryName) {
return fmt.Errorf("cannnot delete binary: %s doesn't exist", BinaryName)
}
if err := sh.Run("rm", "-f", BinaryName); err != nil {
return err
}
fmt.Printf("%s is successfully deleted\n", BinaryName)
return nil
}
// DockerBuild build container with latest tag
func DockerBuild() error {
containerWithTag := fmt.Sprintf(DockerRegistry + "/" + BinaryName + ":" + "latest")
fmt.Printf("Image: %s\n", containerWithTag)
if err := sh.RunV("docker", "build", "--tag", containerWithTag, "."); err != nil {
return err
}
return nil
}
// DockerTestRun test run latest container
func DockerTestRun() error {
containerWithTag := fmt.Sprintf(DockerRegistry + "/" + BinaryName + ":" + "latest")
fmt.Printf("Image: %s\n", containerWithTag)
if err := sh.RunV("docker", "container", "run", containerWithTag, "dns", "a", "google.com"); err != nil {
return err
}
return nil
}
// DockerRelease build and push container to the registry
func DockerRelease() error {
fmt.Printf("Registry: %s\n", DockerRegistry)
tag, err := getLastGitTag()
if err != nil {
return err
}
fmt.Printf("Git tag: %s\n", tag)
containerWithTag := fmt.Sprintf("%s/%s:%s", DockerRegistry, BinaryName, tag)
ver := fmt.Sprintf("VERSION=%s", tag)
if err := sh.RunV("docker", "build", "--build-arg", ver, "--tag", containerWithTag, "."); err != nil {
return err
}
if err := sh.RunV("docker", "push", containerWithTag); err != nil {
return err
}
return nil
}
// GitHubReleaseDryRun goreleaser dry run
func GitHubReleaseDryRun() error {
tag, err := getLastGitTag()
if err != nil {
return err
}
fmt.Printf("Git tag: %s\n", tag)
_, ok := os.LookupEnv("GITHUB_TOKEN")
if !ok {
fmt.Println("env variable GITHUB_TOKEN is not set\n")
}
if err := sh.RunV("goreleaser", "release", "--rm-dist", "--snapshot", "--skip-publish"); err != nil {
return err
}
return nil
}
// GitHubRelease run goreleaser
func GitHubRelease() error {
tag, err := getLastGitTag()
if err != nil {
return err
}
fmt.Printf("Git tag: %s\n", tag)
_, ok := os.LookupEnv("GITHUB_TOKEN")
if !ok {
fmt.Println("env variable GITHUB_TOKEN is not set")
}
if err := sh.RunV("goreleaser", "release", "--rm-dist"); err != nil {
return err
}
return nil
}
// check that file exists
func fileExists(filename string) bool {
info, err := os.Stat(filename)
if os.IsNotExist(err) {
return false
}
return !info.IsDir()
}
// obtain latest git tag
func getLastGitTag() (string, error) {
tag, err := sh.Output("git", "describe", "--abbrev=0", "--tags")
if err != nil {
return "", nil
}
return tag, nil
}