add goreleaser configuration for binaries and deb/rpm packages

- build static binaries for linux, darwin and freebsd
- create deb and rpm packages that register gosh in /etc/shells
- publish releases to Gitea
- add --version flag, set at build time via ldflags

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Florian WaltherandClaude Opus 5.5 committed 2026-10-03 16:58:50 +02:00
1 parent d5c3d03a21
commit 37d6802815
6 files changed
+152

No files matched your search

+1
View File
@@ -1 +1,2 @@
gosh gosh
dist/
+103
View File
@@ -0,0 +1,103 @@
# yaml-language-server: $schema=https://goreleaser.com/static/schema.json
# Release: git tag -a v0.1.0 -m "v0.1.0" && git push origin v0.1.0 && goreleaser release --clean
# Local test (no publishing): goreleaser release --snapshot --clean
version: 2
project_name: gosh
# GITHUB_TOKEN/GITLAB_TOKEN may also be set; always use Gitea.
force_token: gitea
before:
hooks:
- go mod tidy
- go test ./...
builds:
- id: gosh
binary: gosh
main: .
env:
- CGO_ENABLED=0
flags:
- -trimpath
ldflags:
- -s -w -X main.version={{ .Version }}
goos:
- linux
- darwin
- freebsd
goarch:
- amd64
- arm64
- arm
- "386"
goarm:
- "7"
ignore:
- goos: darwin
goarch: "386"
- goos: darwin
goarch: arm
mod_timestamp: "{{ .CommitTimestamp }}"
archives:
- id: gosh
formats: [tar.gz]
name_template: >-
{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}{{ with .Arm }}v{{ . }}{{ end }}
files:
- src: README.md
info:
mode: 0644
nfpms:
- id: gosh
package_name: gosh
file_name_template: "{{ .ConventionalFileName }}"
ids: [gosh]
formats:
- deb
- rpm
vendor: Florian Walther
maintainer: Florian Walther <florian.walther@certainity.com>
homepage: https://gitea.scu.si/Florian.Walther/gosh
description: |-
gosh - a simple shell written in Go
Proof of concept with history, tab completion,
tilde and environment variable expansion.
license: ""
section: shells
priority: optional
bindir: /usr/bin
contents:
- src: README.md
dst: /usr/share/doc/gosh/README.md
file_info:
mode: 0644
scripts:
postinstall: packaging/scripts/postinstall.sh
postremove: packaging/scripts/postremove.sh
checksum:
name_template: checksums.txt
snapshot:
version_template: "{{ incpatch .Version }}-next"
changelog:
sort: asc
filters:
exclude:
- "^docs:"
- "^test:"
# Repository is hosted on Gitea; requires GITEA_TOKEN in the environment.
gitea_urls:
api: https://gitea.scu.si/api/v1
download: https://gitea.scu.si
release:
gitea:
owner: Florian.Walther
name: gosh
+17
View File
@@ -44,3 +44,20 @@ _gosh is not meant for production use, it is just a proof of concept._
```bash ```bash
go build ./ go build ./
``` ```
## Release
Binaries sowie `.deb`- und `.rpm`-Pakete werden mit [GoReleaser](https://goreleaser.com) gebaut (Konfiguration: `.goreleaser.yaml`).
```bash
# lokal testen, ohne etwas zu veröffentlichen (Ergebnis in dist/)
goreleaser release --snapshot --clean
# Release auf Gitea veröffentlichen
export GITEA_TOKEN=...
git tag -a v0.1.0 -m "v0.1.0"
git push origin v0.1.0
goreleaser release --clean
```
Das Paket installiert `/usr/bin/gosh` und trägt die Shell in `/etc/shells` ein, sodass sie mit `chsh -s /usr/bin/gosh` gesetzt werden kann.
+8
View File
@@ -19,6 +19,9 @@ import (
// ErrNoPath is returned when 'cd' was called without a second argument. // ErrNoPath is returned when 'cd' was called without a second argument.
var ErrNoPath = errors.New("path required") var ErrNoPath = errors.New("path required")
// version is set at build time via -ldflags "-X main.version=..."
var version = "dev"
// previousDir tracks the previous working directory for 'cd -' support // previousDir tracks the previous working directory for 'cd -' support
var previousDir string var previousDir string
@@ -483,6 +486,11 @@ func completeFilePath(line, prefix string) []string {
} }
func main() { func main() {
if len(os.Args) > 1 && (os.Args[1] == "--version" || os.Args[1] == "-V") {
fmt.Println("gosh", version)
return
}
// Ctrl+C sends SIGINT to the whole foreground process group. Catch it so // Ctrl+C sends SIGINT to the whole foreground process group. Catch it so
// that it only stops the running command and not the shell. (signal.Ignore // that it only stops the running command and not the shell. (signal.Ignore
// would be inherited by the child processes.) // would be inherited by the child processes.)
+9
View File
@@ -0,0 +1,9 @@
#!/bin/sh
# Register gosh as a login shell in /etc/shells.
set -e
if command -v add-shell >/dev/null 2>&1; then
add-shell /usr/bin/gosh
elif ! grep -qx /usr/bin/gosh /etc/shells 2>/dev/null; then
echo /usr/bin/gosh >> /etc/shells
fi
+14
View File
@@ -0,0 +1,14 @@
#!/bin/sh
# Remove gosh from /etc/shells on uninstall (not on upgrade).
# deb passes "remove"/"purge", rpm passes "0" on final removal.
set -e
case "$1" in
remove|purge|0)
if command -v remove-shell >/dev/null 2>&1; then
remove-shell /usr/bin/gosh
elif [ -f /etc/shells ]; then
sed -i '\|^/usr/bin/gosh$|d' /etc/shells
fi
;;
esac