cmd/dist: replace dist/release.sh
Some checks failed
Test / Create distribution (push) Successful in 1m18s
Test / Sandbox (push) Successful in 3m15s
Test / Hakurei (push) Successful in 4m28s
Test / ShareFS (push) Successful in 4m34s
Test / Sandbox (race detector) (push) Successful in 5m41s
Test / Hakurei (race detector) (push) Failing after 6m53s
Test / Flake checks (push) Has been skipped
Some checks failed
Test / Create distribution (push) Successful in 1m18s
Test / Sandbox (push) Successful in 3m15s
Test / Hakurei (push) Successful in 4m28s
Test / ShareFS (push) Successful in 4m34s
Test / Sandbox (race detector) (push) Successful in 5m41s
Test / Hakurei (race detector) (push) Failing after 6m53s
Test / Flake checks (push) Has been skipped
This is much more robust than a shell script. Signed-off-by: Ophestra <cat@gensokyo.uk>
This commit is contained in:
31
.gitignore
vendored
31
.gitignore
vendored
@@ -1,27 +1,7 @@
|
|||||||
# Binaries for programs and plugins
|
# produced by tools and text editors
|
||||||
*.exe
|
*.qcow2
|
||||||
*.exe~
|
|
||||||
*.dll
|
|
||||||
*.so
|
|
||||||
*.dylib
|
|
||||||
*.pkg
|
|
||||||
/hakurei
|
|
||||||
|
|
||||||
# Test binary, built with `go test -c`
|
|
||||||
*.test
|
*.test
|
||||||
|
|
||||||
# Output of the go coverage tool, specifically when used with LiteIDE
|
|
||||||
*.out
|
*.out
|
||||||
|
|
||||||
# Dependency directories (remove the comment below to include it)
|
|
||||||
# vendor/
|
|
||||||
|
|
||||||
# Go workspace file
|
|
||||||
go.work
|
|
||||||
go.work.sum
|
|
||||||
|
|
||||||
# env file
|
|
||||||
.env
|
|
||||||
.idea
|
.idea
|
||||||
.vscode
|
.vscode
|
||||||
|
|
||||||
@@ -30,8 +10,5 @@ go.work.sum
|
|||||||
/internal/pkg/testdata/testtool
|
/internal/pkg/testdata/testtool
|
||||||
/internal/rosa/hakurei_current.tar.gz
|
/internal/rosa/hakurei_current.tar.gz
|
||||||
|
|
||||||
# release
|
# cmd/dist default destination
|
||||||
/dist/hakurei-*
|
/dist
|
||||||
|
|
||||||
# interactive nixos vm
|
|
||||||
nixos.qcow2
|
|
||||||
|
|||||||
6
all.sh
Executable file
6
all.sh
Executable file
@@ -0,0 +1,6 @@
|
|||||||
|
#!/bin/sh -e
|
||||||
|
|
||||||
|
TOOLCHAIN_VERSION="$(go version)"
|
||||||
|
cd "$(dirname -- "$0")/"
|
||||||
|
echo "# Building cmd/dist using ${TOOLCHAIN_VERSION}."
|
||||||
|
go run -v --tags=dist ./cmd/dist
|
||||||
228
cmd/dist/main.go
vendored
Normal file
228
cmd/dist/main.go
vendored
Normal file
@@ -0,0 +1,228 @@
|
|||||||
|
//go:build dist
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"archive/tar"
|
||||||
|
"compress/gzip"
|
||||||
|
"context"
|
||||||
|
"crypto/sha512"
|
||||||
|
_ "embed"
|
||||||
|
"encoding/hex"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"io/fs"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"os/signal"
|
||||||
|
"path/filepath"
|
||||||
|
"runtime"
|
||||||
|
)
|
||||||
|
|
||||||
|
// getenv looks up an environment variable, and returns fallback if it is unset.
|
||||||
|
func getenv(key, fallback string) string {
|
||||||
|
if v, ok := os.LookupEnv(key); ok {
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
return fallback
|
||||||
|
}
|
||||||
|
|
||||||
|
// mustRun runs a command with the current process's environment and panics
|
||||||
|
// on error or non-zero exit code.
|
||||||
|
func mustRun(ctx context.Context, name string, arg ...string) {
|
||||||
|
cmd := exec.CommandContext(ctx, name, arg...)
|
||||||
|
cmd.Stdin, cmd.Stdout, cmd.Stderr = os.Stdin, os.Stdout, os.Stderr
|
||||||
|
if err := cmd.Run(); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//go:embed comp/_hakurei
|
||||||
|
var comp []byte
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println()
|
||||||
|
log.SetFlags(0)
|
||||||
|
log.SetPrefix("# ")
|
||||||
|
|
||||||
|
version := getenv("HAKUREI_VERSION", "untagged")
|
||||||
|
prefix := getenv("PREFIX", "/usr")
|
||||||
|
destdir := getenv("DESTDIR", "dist")
|
||||||
|
|
||||||
|
if err := os.MkdirAll(destdir, 0755); err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
s, err := os.MkdirTemp(destdir, ".dist.*")
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
defer func() {
|
||||||
|
var code int
|
||||||
|
|
||||||
|
if err = os.RemoveAll(s); err != nil {
|
||||||
|
code = 1
|
||||||
|
log.Println(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if r := recover(); r != nil {
|
||||||
|
code = 1
|
||||||
|
log.Println(r)
|
||||||
|
}
|
||||||
|
|
||||||
|
os.Exit(code)
|
||||||
|
}()
|
||||||
|
|
||||||
|
ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt)
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
log.Println("Building hakurei.")
|
||||||
|
mustRun(ctx, "go", "generate", "./...")
|
||||||
|
mustRun(
|
||||||
|
ctx, "go", "build",
|
||||||
|
"-trimpath",
|
||||||
|
"-v", "-o", s,
|
||||||
|
"-ldflags=-s -w "+
|
||||||
|
"-buildid= -linkmode external -extldflags=-static "+
|
||||||
|
"-X hakurei.app/internal/info.buildVersion="+version+" "+
|
||||||
|
"-X hakurei.app/internal/info.hakureiPath="+prefix+"/bin/hakurei "+
|
||||||
|
"-X hakurei.app/internal/info.hsuPath="+prefix+"/bin/hsu "+
|
||||||
|
"-X main.hakureiPath="+prefix+"/bin/hakurei",
|
||||||
|
"./...",
|
||||||
|
)
|
||||||
|
fmt.Println()
|
||||||
|
|
||||||
|
log.Println("Testing Hakurei.")
|
||||||
|
mustRun(
|
||||||
|
ctx, "go", "test",
|
||||||
|
"-ldflags=-buildid= -linkmode external -extldflags=-static",
|
||||||
|
"./...",
|
||||||
|
)
|
||||||
|
fmt.Println()
|
||||||
|
|
||||||
|
log.Println("Creating distribution.")
|
||||||
|
const suffix = ".tar.gz"
|
||||||
|
distName := "hakurei-" + version + "-" + runtime.GOARCH
|
||||||
|
var f *os.File
|
||||||
|
if f, err = os.OpenFile(
|
||||||
|
filepath.Join(s, distName+suffix),
|
||||||
|
os.O_CREATE|os.O_EXCL|os.O_WRONLY,
|
||||||
|
0644,
|
||||||
|
); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
defer func() {
|
||||||
|
if f == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err = f.Close(); err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
h := sha512.New()
|
||||||
|
gw := gzip.NewWriter(io.MultiWriter(f, h))
|
||||||
|
tw := tar.NewWriter(gw)
|
||||||
|
|
||||||
|
mustWriteHeader := func(name string, size int64, mode os.FileMode) {
|
||||||
|
if err = tw.WriteHeader(&tar.Header{
|
||||||
|
Name: filepath.Join(distName, name),
|
||||||
|
Size: size,
|
||||||
|
Mode: int64(mode),
|
||||||
|
Uname: "root",
|
||||||
|
Gname: "root",
|
||||||
|
}); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if mode&os.ModeDir != 0 {
|
||||||
|
fmt.Printf("%s %s\n", mode, name)
|
||||||
|
} else {
|
||||||
|
fmt.Printf("%s %s (%d bytes)\n", mode, name, size)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mustWriteFile := func(name string, data []byte, mode os.FileMode) {
|
||||||
|
mustWriteHeader(name, int64(len(data)), mode)
|
||||||
|
if mode&os.ModeDir != 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if _, err = tw.Write(data); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mustWriteFromPath := func(dst, src string) {
|
||||||
|
var r *os.File
|
||||||
|
if r, err = os.Open(src); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var fi os.FileInfo
|
||||||
|
if fi, err = r.Stat(); err != nil {
|
||||||
|
_ = r.Close()
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
mustWriteHeader(dst, fi.Size(), fi.Mode())
|
||||||
|
if _, err = io.Copy(tw, r); err != nil {
|
||||||
|
_ = r.Close()
|
||||||
|
panic(err)
|
||||||
|
} else if err = r.Close(); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mustWriteFile(".", nil, fs.ModeDir|0755)
|
||||||
|
mustWriteFile("comp/", nil, os.ModeDir|0755)
|
||||||
|
mustWriteFile("comp/_hakurei", comp, 0644)
|
||||||
|
mustWriteFile("install.sh", []byte(`#!/bin/sh -e
|
||||||
|
cd "$(dirname -- "$0")" || exit 1
|
||||||
|
|
||||||
|
install -vDm0755 "bin/hakurei" "${DESTDIR}`+prefix+`/bin/hakurei"
|
||||||
|
install -vDm0755 "bin/sharefs" "${DESTDIR}`+prefix+`/bin/sharefs"
|
||||||
|
|
||||||
|
install -vDm4511 "bin/hsu" "${DESTDIR}`+prefix+`/bin/hsu"
|
||||||
|
if [ ! -f "${DESTDIR}/etc/hsurc" ]; then
|
||||||
|
install -vDm0400 "hsurc.default" "${DESTDIR}/etc/hsurc"
|
||||||
|
fi
|
||||||
|
|
||||||
|
install -vDm0644 "comp/_hakurei" "${DESTDIR}`+prefix+`/share/zsh/site-functions/_hakurei"
|
||||||
|
`), 0755)
|
||||||
|
|
||||||
|
mustWriteFromPath("README.md", "README.md")
|
||||||
|
mustWriteFile("hsurc.default", []byte("1000 0"), 0400)
|
||||||
|
for _, name := range []string{
|
||||||
|
"hsu",
|
||||||
|
"hakurei",
|
||||||
|
"sharefs",
|
||||||
|
} {
|
||||||
|
mustWriteFromPath(
|
||||||
|
filepath.Join("bin", name),
|
||||||
|
filepath.Join(s, name),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err = tw.Close(); err != nil {
|
||||||
|
panic(err)
|
||||||
|
} else if err = gw.Close(); err != nil {
|
||||||
|
panic(err)
|
||||||
|
} else if err = f.Close(); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
f = nil
|
||||||
|
|
||||||
|
if err = os.WriteFile(
|
||||||
|
filepath.Join(destdir, distName+suffix+".sha512"),
|
||||||
|
append(hex.AppendEncode(nil, h.Sum(nil)), " "+distName+suffix+"\n"...),
|
||||||
|
0644,
|
||||||
|
); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
if err = os.Rename(
|
||||||
|
filepath.Join(s, distName+suffix),
|
||||||
|
filepath.Join(destdir, distName+suffix),
|
||||||
|
); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
1
dist/hsurc.default
vendored
1
dist/hsurc.default
vendored
@@ -1 +0,0 @@
|
|||||||
1000 0
|
|
||||||
12
dist/install.sh
vendored
12
dist/install.sh
vendored
@@ -1,12 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
cd "$(dirname -- "$0")" || exit 1
|
|
||||||
|
|
||||||
install -vDm0755 "bin/hakurei" "${DESTDIR}/usr/bin/hakurei"
|
|
||||||
install -vDm0755 "bin/sharefs" "${DESTDIR}/usr/bin/sharefs"
|
|
||||||
|
|
||||||
install -vDm4511 "bin/hsu" "${DESTDIR}/usr/bin/hsu"
|
|
||||||
if [ ! -f "${DESTDIR}/etc/hsurc" ]; then
|
|
||||||
install -vDm0400 "hsurc.default" "${DESTDIR}/etc/hsurc"
|
|
||||||
fi
|
|
||||||
|
|
||||||
install -vDm0644 "comp/_hakurei" "${DESTDIR}/usr/share/zsh/site-functions/_hakurei"
|
|
||||||
36
dist/release.sh
vendored
36
dist/release.sh
vendored
@@ -1,36 +0,0 @@
|
|||||||
#!/bin/sh -e
|
|
||||||
cd "$(dirname -- "$0")/.."
|
|
||||||
VERSION="${HAKUREI_VERSION:-untagged}"
|
|
||||||
prefix="${PREFIX:-/usr}"
|
|
||||||
pname="hakurei-${VERSION}-$(go env GOARCH)"
|
|
||||||
out="${DESTDIR:-dist}/${pname}"
|
|
||||||
|
|
||||||
destroy_workdir() {
|
|
||||||
rm -rf "${out}"
|
|
||||||
}
|
|
||||||
trap destroy_workdir EXIT
|
|
||||||
|
|
||||||
echo '# Preparing distribution files.'
|
|
||||||
mkdir -p "${out}"
|
|
||||||
cp -v "README.md" "dist/hsurc.default" "dist/install.sh" "${out}"
|
|
||||||
cp -rv "dist/comp" "${out}"
|
|
||||||
echo
|
|
||||||
|
|
||||||
echo '# Building hakurei.'
|
|
||||||
go generate ./...
|
|
||||||
go build -trimpath -v -o "${out}/bin/" -ldflags "-s -w
|
|
||||||
-buildid= -linkmode external -extldflags=-static
|
|
||||||
-X hakurei.app/internal/info.buildVersion=${VERSION}
|
|
||||||
-X hakurei.app/internal/info.hakureiPath=${prefix}/bin/hakurei
|
|
||||||
-X hakurei.app/internal/info.hsuPath=${prefix}/bin/hsu
|
|
||||||
-X main.hakureiPath=${prefix}/bin/hakurei" ./...
|
|
||||||
echo
|
|
||||||
|
|
||||||
echo '# Testing hakurei.'
|
|
||||||
go test -ldflags='-buildid= -linkmode external -extldflags=-static' ./...
|
|
||||||
echo
|
|
||||||
|
|
||||||
echo '# Creating distribution.'
|
|
||||||
rm -f "${out}.tar.gz" && tar -C "${out}/.." -vczf "${out}.tar.gz" "${pname}"
|
|
||||||
(cd "${out}/.." && sha512sum "${pname}.tar.gz" > "${pname}.tar.gz.sha512")
|
|
||||||
echo
|
|
||||||
@@ -141,7 +141,7 @@
|
|||||||
PATH="${pkgs.pkgsStatic.musl.bin}/bin:$PATH" \
|
PATH="${pkgs.pkgsStatic.musl.bin}/bin:$PATH" \
|
||||||
DESTDIR="$out" \
|
DESTDIR="$out" \
|
||||||
HAKUREI_VERSION="v${hakurei.version}" \
|
HAKUREI_VERSION="v${hakurei.version}" \
|
||||||
./dist/release.sh
|
./all.sh
|
||||||
'';
|
'';
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -116,7 +116,7 @@ buildGo126Module rec {
|
|||||||
];
|
];
|
||||||
in
|
in
|
||||||
''
|
''
|
||||||
install -D --target-directory=$out/share/zsh/site-functions dist/comp/*
|
install -D --target-directory=$out/share/zsh/site-functions cmd/dist/comp/*
|
||||||
|
|
||||||
mkdir "$out/libexec"
|
mkdir "$out/libexec"
|
||||||
mv "$out"/bin/* "$out/libexec/"
|
mv "$out"/bin/* "$out/libexec/"
|
||||||
|
|||||||
Reference in New Issue
Block a user