/
make-release.go
130 lines (111 loc) · 3.54 KB
/
make-release.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
package main
import (
"flag"
"fmt"
"os"
"path/filepath"
"runtime/debug"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"encr.dev/internal/version"
"encr.dev/pkg/encorebuild"
"encr.dev/pkg/encorebuild/buildconf"
"encr.dev/pkg/encorebuild/buildutil"
"encr.dev/pkg/option"
)
func join(strs ...string) string {
return filepath.Join(strs...)
}
func main() {
log.Logger = zerolog.New(zerolog.NewConsoleWriter()).With().Caller().Timestamp().Stack().Logger()
dst := flag.String("dst", "", "build destination")
versionStr := flag.String("v", "", "version number")
onlyBuild := flag.String("only", "", "build only the valid target ('darwin-arm64' or 'darwin' or 'arm64' or '' for all)")
publishNPM := flag.Bool("publish-npm", false, "publish packages to npm")
flag.Parse()
if *dst == "" || *versionStr == "" {
log.Fatal().Msgf("missing -dst %q or -v %q", *dst, *versionStr)
}
if (*versionStr)[0] != 'v' {
log.Fatal().Msg("version must start with 'v'")
}
switch version.ChannelFor(*versionStr) {
case version.GA, version.Beta, version.Nightly, version.DevBuild:
// no-op
default:
log.Fatal().Msgf("unknown version channel for %s", *versionStr)
}
root, err := os.Getwd()
if err != nil {
log.Fatal().Err(err).Msg("failed to get working directory")
} else if _, err := os.Stat(join(root, "go.mod")); err != nil {
log.Fatal().Err(err).Msg("expected to run make-release.go from encr.dev repository root")
}
userCacheDir, err := os.UserCacheDir()
if err != nil {
log.Fatal().Err(err).Msg("failed to get user cache dir")
}
cacheDir := filepath.Join(userCacheDir, "encore-build-cache")
*dst, err = filepath.Abs(*dst)
if err != nil {
log.Fatal().Err(err).Msg("failed to get absolute path to destination")
}
// Prepare the target directory.
if err := os.RemoveAll(*dst); err != nil {
log.Fatal().Err(err).Msg("failed to remove existing target dir")
} else if err := os.MkdirAll(filepath.Join(*dst, "artifacts"), 0755); err != nil {
log.Fatal().Err(err).Msg("failed to create target dir")
}
type buildTarget struct {
OS string
Arch string
}
targets := []buildTarget{
{"darwin", "amd64"},
{"darwin", "arm64"},
{"linux", "amd64"},
{"linux", "arm64"},
{"windows", "amd64"},
}
var parralelFuncs []func()
// Give them the common settings
for _, t := range targets {
if *onlyBuild != "" && !(*onlyBuild == fmt.Sprintf("%s-%s", t.OS, t.Arch) ||
*onlyBuild == t.OS ||
*onlyBuild == t.Arch) {
continue
}
b := &encorebuild.DistBuilder{
Cfg: &buildconf.Config{
Log: log.With().Str("os", t.OS).Str("arch", t.Arch).Logger(),
OS: t.OS,
Arch: t.Arch,
Release: true,
Version: *versionStr,
RepoDir: root,
CacheDir: cacheDir,
MacSDKPath: option.Some("/sdk"),
PublishNPMPackages: *publishNPM,
},
DistBuildDir: join(*dst, t.OS+"_"+t.Arch),
ArtifactsTarFile: join(*dst, "artifacts", "encore-"+*versionStr+"-"+t.OS+"_"+t.Arch+".tar.gz"),
}
parralelFuncs = append(parralelFuncs, b.Build)
}
defer func() {
if err := recover(); err != nil {
if b, ok := err.(buildutil.Bailout); ok {
log.Fatal().Err(b.Err).Msg("failed to build")
} else {
stack := debug.Stack()
log.Fatal().Msgf("failed to build: unrecovered panic: %v: \n%s", err, stack)
}
}
}()
buildutil.RunParallel(parralelFuncs...)
log.Info().Msg("all distributions built successfully")
if *publishNPM {
encorebuild.PublishNPMPackages(root, *versionStr)
}
log.Info().Msg("successfully published NPM package")
}