Skip to content

Commit 2ed1eee

Browse files
committed
Migrate build/release pipeline to goreleaser
Replaces the hand-rolled justfile cross-compile/dpkg-deb packaging with goreleaser (.goreleaser.yaml), which now also produces .rpm packages via nfpm for free. justfile becomes a thin wrapper around goreleaser, CI workflows call it directly instead of the previous-tag/softprops-release dance, and the now-redundant control file is removed. Snap packaging is left untouched since goreleaser doesn't build snaps. Also updates the README with an RPM install section, notes that Windows/ FreeBSD binaries are published too, and fixes the stale `go get` install instructions to `go install`.
1 parent 8615493 commit 2ed1eee

8 files changed

Lines changed: 150 additions & 131 deletions

File tree

.github/workflows/build.yml

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,8 @@ jobs:
88
runs-on: ubuntu-latest
99
steps:
1010
- uses: actions/checkout@v7
11-
- name: 'Get Previous tag'
12-
id: previoustag
13-
uses: "WyriHaximus/github-action-get-previous-tag@v2"
14-
- name: Set version
15-
run: |
16-
export VERSION=${{ steps.previoustag.outputs.tag }}
11+
with:
12+
fetch-depth: 0
1713
- name: Setup tools
1814
run: sudo apt-get install pandoc
1915
- name: Set up Go
@@ -22,6 +18,9 @@ jobs:
2218
go-version-file: 'go.mod'
2319
- name: Install just
2420
uses: extractions/setup-just@v4
21+
- name: Install goreleaser
22+
uses: goreleaser/goreleaser-action@v6
23+
with:
24+
install-only: true
2525
- name: Build
26-
run: VERSION="${{ steps.previoustag.outputs.tag }}" just all
27-
26+
run: just build

.github/workflows/release.yml

Lines changed: 9 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,8 @@ jobs:
1313
runs-on: ubuntu-latest
1414
steps:
1515
- uses: actions/checkout@v7
16-
- name: 'Get Previous tag'
17-
id: previoustag
18-
uses: "WyriHaximus/github-action-get-previous-tag@v2"
16+
with:
17+
fetch-depth: 0
1918
- name: Setup tools
2019
run: sudo apt-get install pandoc
2120
- name: Set up Go
@@ -24,24 +23,11 @@ jobs:
2423
go-version-file: 'go.mod'
2524
- name: Install just
2625
uses: extractions/setup-just@v4
27-
- name: Build
28-
run: |
29-
VERSION="${{ steps.previoustag.outputs.tag }}" just all
30-
VERSION="${{ steps.previoustag.outputs.tag }}" just deb
31-
- name: Release
32-
uses: softprops/action-gh-release@v2
26+
- name: Install goreleaser
27+
uses: goreleaser/goreleaser-action@v6
3328
with:
34-
draft: true
35-
prerelease: false
36-
name: ${{ steps.previoustag.outputs.tag }}
37-
tag_name: ${{ steps.previoustag.outputs.tag }}
38-
files: |
39-
mdview-${{ steps.previoustag.outputs.tag }}-linux-amd64.tar.gz
40-
mdview-${{ steps.previoustag.outputs.tag }}-linux-i386.tar.gz
41-
mdview-${{ steps.previoustag.outputs.tag }}-linux-arm64.tar.gz
42-
mdview-${{ steps.previoustag.outputs.tag }}-darwin-amd64.tar.gz
43-
mdview-${{ steps.previoustag.outputs.tag }}-darwin-arm64.tar.gz
44-
mdview-${{ steps.previoustag.outputs.tag }}-windows-amd64.zip
45-
mdview-${{ steps.previoustag.outputs.tag }}-freebsd-amd64.tar.gz
46-
mdview_${{ steps.previoustag.outputs.tag }}_amd64.deb
47-
mdview_${{ steps.previoustag.outputs.tag }}_arm64.deb
29+
install-only: true
30+
- name: Release
31+
env:
32+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
33+
run: just release

.gitignore

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
1-
bin/*
21
mdview
32
mdview.exe
3+
dist/
44
*.tar.gz
5-
freebsd-amd64.tar.gz
6-
linux-amd64.tar.gz
75
*.zip
86
prime/
97
parts/
108
.snapcraft
119
*.snap
12-
package/*
1310
*.deb
11+
*.rpm
1412
mdview.1
1513
mise.toml

.goreleaser.yaml

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
version: 2
2+
3+
before:
4+
hooks:
5+
- just manpage
6+
7+
builds:
8+
- id: mdview
9+
main: .
10+
binary: mdview
11+
ldflags:
12+
- -s -w -X main.appVersion={{.Version}}
13+
goos:
14+
- linux
15+
- windows
16+
- darwin
17+
- freebsd
18+
goarch:
19+
- amd64
20+
- arm64
21+
ignore:
22+
- goos: windows
23+
goarch: arm64
24+
- goos: freebsd
25+
goarch: arm64
26+
27+
- id: mdview-linux-386
28+
main: .
29+
binary: mdview
30+
ldflags:
31+
- -s -w -X main.appVersion={{.Version}}
32+
goos:
33+
- linux
34+
goarch:
35+
- "386"
36+
37+
archives:
38+
- id: mdview
39+
ids:
40+
- mdview
41+
- mdview-linux-386
42+
name_template: "mdview-{{.Version}}-{{.Os}}-{{.Arch}}"
43+
formats:
44+
- tar.gz
45+
format_overrides:
46+
- goos: windows
47+
formats:
48+
- zip
49+
files:
50+
- mdview.1
51+
52+
nfpms:
53+
- id: mdview
54+
ids:
55+
- mdview
56+
package_name: mdview
57+
file_name_template: "mdview_{{.Version}}_{{.Arch}}"
58+
vendor: bugzapperlabs.com
59+
maintainer: bugzapperlabs.com
60+
description: "Markdown View - Command line utility to format markdown and launch it in a browser."
61+
section: custom
62+
priority: optional
63+
formats:
64+
- deb
65+
- rpm
66+
bindir: /usr/bin
67+
contents:
68+
- src: mdview.1
69+
dst: /usr/share/man/man1/mdview.1
70+
71+
checksum:
72+
name_template: "checksums.txt"
73+
74+
release:
75+
draft: true
76+
77+
changelog:
78+
disable: true

CLAUDE.md

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,21 @@ no other Go source files and no test files currently in the repo.
1010

1111
## Build & run
1212

13-
Requires Go (see `go.mod`/`mise.toml` for version) and, for packaging targets, `just` and `pandoc`.
13+
Requires Go (see `go.mod`/`mise.toml` for version) and, for packaging, `just`, `pandoc`, and
14+
[`goreleaser`](https://goreleaser.com/).
1415

1516
- Quick local build: `go build` (produces `./mdview`)
1617
- Run directly without building: `go run . <filename.md>`
17-
- Full cross-platform build via `just` (uses `justfile`, the project's task runner — replaced the old Makefile):
18-
- `just` or `just linux` — Linux amd64/arm64/i386 builds
19-
- `just all` — linux + windows + darwin + freebsd
20-
- `just deb` — build `.deb` packages (requires a prior linux build)
21-
- `just snap` — build snap package via `snapcraft`
22-
- `just clean` — remove build artifacts
23-
- Pass `VERSION=x.y.z` as an env var to any target to stamp the version (embedded via `-ldflags -X main.appVersion=...`); CI derives this from the previous git tag.
24-
- `just manpage` regenerates `mdview.1` from `mdview.1.md` via pandoc.
18+
- Full cross-platform build + packaging via `just` (uses `justfile`, which thinly wraps
19+
`goreleaser`; config lives in `.goreleaser.yaml`):
20+
- `just` or `just build` — cross-compiles all platform binaries via `goreleaser build --snapshot` (linux amd64/arm64/386, windows amd64, darwin amd64/arm64, freebsd amd64)
21+
- `just release-snapshot` — full local dry run producing archives + `.deb`/`.rpm` packages in `dist/` without publishing
22+
- `just release` — the real release (`goreleaser release --clean`); publishes a draft GitHub release, run from CI on tag push
23+
- `just check` — validates `.goreleaser.yaml`
24+
- `just snap` — build snap package via `snapcraft` (kept separate; goreleaser doesn't build snaps)
25+
- `just clean` — remove build artifacts (`dist/`, `mdview.1`, `*.snap`)
26+
- `just manpage` regenerates `mdview.1` from `mdview.1.md` via pandoc; goreleaser runs this automatically as a `before.hooks` step.
27+
- Versioning is read directly from git tags by goreleaser (embedded via `-ldflags -X main.appVersion={{.Version}}`) — there's no `VERSION` env var to pass anymore.
2528
- There is no test suite and no lint target configured; `go vet ./...` and `gofmt` are reasonable sanity checks before committing.
2629

2730
## Architecture
@@ -46,8 +49,13 @@ Output location resolution order: `MDVIEW_DIR` env var → (if running as a Snap
4649

4750
### Packaging
4851

49-
`justfile`, `control` (Debian control file template, `VERSION` substituted at build time), `mdview.1.md`
50-
(man page source) and `snap/` all support the release pipeline in `.github/workflows/release.yml`,
51-
which triggers on tag push, builds all platform targets + deb packages via `just`, and publishes a
52-
draft GitHub release with `softprops/action-gh-release`. `.github/workflows/build.yml` runs the same
53-
`just all` build on every push as a CI check (no tests to run).
52+
`.goreleaser.yaml` drives cross-platform binary builds, archives (`.tar.gz`/`.zip`), and `.deb`/
53+
`.rpm` packages (via goreleaser's built-in `nfpm` integration — no more hand-rolled `control` file
54+
or `dpkg-deb` invocation). `justfile` wraps the `goreleaser` CLI so `just <target>` stays the single
55+
local entry point. `mdview.1.md` (man page source) and `snap/` (built separately via `just snap`,
56+
outside goreleaser) round out packaging.
57+
58+
`.github/workflows/release.yml` triggers on tag push, runs `just release`, and publishes a draft
59+
GitHub release (goreleaser reads the version straight from the pushed git tag — no more
60+
previous-tag lookup step). `.github/workflows/build.yml` runs `just build` (a `goreleaser build
61+
--snapshot`) on every push as a CI sanity check (no tests to run).

README.md

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,25 @@ To remove the package:
9696
sudo dpkg --remove mdview
9797
```
9898

99+
### RPM Package
100+
101+
If you're running Fedora or another RPM-based distro, download the package and
102+
install it from the [Releases](https://github.com/mapitman/mdview/releases) page.
103+
104+
```sh
105+
curl -s https://api.github.com/repos/mapitman/mdview/releases/latest \
106+
| grep "browser_download_url.*amd64.rpm" \
107+
| cut -d '"' -f 4 \
108+
| xargs curl -L -o mdview_lastest_amd64.rpm
109+
sudo rpm -i mdview_lastest_amd64.rpm
110+
```
111+
112+
To remove the package:
113+
114+
```sh
115+
sudo rpm -e mdview
116+
```
117+
99118
### Snap Package
100119

101120
_Update: The snap package has been fixed and the latest version is now available as a snap._ 🥳
@@ -121,13 +140,14 @@ Don't have snapd?
121140
### Manual Download and Install
122141

123142
Grab the correct binary for your operating system
124-
[here](https://github.com/mapitman/mdview/releases/).
143+
[here](https://github.com/mapitman/mdview/releases/). Linux, macOS, Windows, and FreeBSD
144+
binaries are all published with every release.
125145

126146
### Compile Yourself
127147

128148
If you have Golang installed...
129149
```sh
130-
go get github.com/mapitman/mdview
150+
go install github.com/mapitman/mdview@latest
131151
```
132152

133153
Don't have Golang? [Get it now](https://golang.org/doc/install).

control

Lines changed: 0 additions & 10 deletions
This file was deleted.

justfile

Lines changed: 10 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,84 +1,24 @@
11
set shell := ["/bin/bash", "-c"]
22

3-
VERSION := env_var_or_default("VERSION", "")
3+
default: build
44

5-
MANSECTION := env_var_or_default("MANSECTION", "1")
5+
check:
6+
goreleaser check
67

7-
default: linux
8-
all: linux windows darwin freebsd
8+
build:
9+
goreleaser build --snapshot --clean
910

10-
linux: bin-linux-amd64-mdview bin-linux-arm64-mdview bin-linux-i386-mdview
11-
windows: bin-windows-amd64-mdview-exe
12-
darwin: bin-darwin-amd64-mdview bin-darwin-arm64-mdview
13-
freebsd: bin-freebsd-amd64-mdview
11+
release-snapshot:
12+
goreleaser release --snapshot --clean --skip=publish
1413

15-
deb: deb-linux-amd64 deb-linux-arm64
16-
17-
deb-linux-amd64: bin-linux-amd64-mdview
18-
mkdir -p package/DEBIAN
19-
mkdir -p package/usr/bin/
20-
mkdir -p package/usr/share/man/man1/
21-
cp control package/DEBIAN/
22-
sed -i "s/VERSION/{{VERSION}}/g" package/DEBIAN/control
23-
cp -r bin/linux-amd64/mdview package/usr/bin/mdview
24-
cp mdview.1 package/usr/share/man/man1/
25-
dpkg-deb --build package
26-
mv package.deb mdview_{{VERSION}}_amd64.deb
27-
28-
deb-linux-arm64: bin-linux-arm64-mdview
29-
mkdir -p package/DEBIAN
30-
mkdir -p package/usr/bin/
31-
mkdir -p package/usr/share/man/man1/
32-
cp control package/DEBIAN/
33-
sed -i "s/VERSION/{{VERSION}}/g" package/DEBIAN/control
34-
cp -r bin/linux-arm64/mdview package/usr/bin/mdview
35-
cp mdview.1 package/usr/share/man/man1/
36-
dpkg-deb --build package
37-
mv package.deb mdview_{{VERSION}}_arm64.deb
14+
release:
15+
goreleaser release --clean
3816

3917
snap:
4018
snapcraft pack
4119

42-
bin-linux-amd64-mdview: manpage
43-
env GOOS=linux GOARCH=amd64 go build -ldflags "-X main.appVersion={{VERSION}}" -o ./bin/linux-amd64/mdview
44-
cp mdview.1 bin/linux-amd64/
45-
tar czvf mdview-{{VERSION}}-linux-amd64.tar.gz --transform s/linux-amd64/mdview-{{VERSION}}/ -C bin linux-amd64
46-
47-
bin-linux-i386-mdview:
48-
env GOOS=linux GOARCH=386 go build -ldflags "-X main.appVersion={{VERSION}}" -o ./bin/linux-i386/mdview
49-
cp mdview.1 bin/linux-i386/
50-
tar czvf mdview-{{VERSION}}-linux-i386.tar.gz --transform s/linux-i386/mdview-{{VERSION}}/ -C bin linux-i386
51-
52-
bin-linux-arm64-mdview:
53-
env GOOS=linux GOARCH=arm64 go build -ldflags "-X main.appVersion={{VERSION}}" -o ./bin/linux-arm64/mdview
54-
cp mdview.1 bin/linux-arm64/
55-
tar czvf mdview-{{VERSION}}-linux-arm64.tar.gz --transform s/linux-arm64/mdview-{{VERSION}}/ -C bin linux-arm64
56-
57-
bin-windows-amd64-mdview-exe:
58-
env GOOS=windows GOARCH=amd64 go build -ldflags "-X main.appVersion={{VERSION}}" -o ./bin/windows-amd64/mdview.exe
59-
zip -j mdview-{{VERSION}}-windows-amd64.zip bin/windows-amd64/mdview.exe
60-
61-
bin-darwin-amd64-mdview:
62-
env GOOS=darwin GOARCH=amd64 go build -ldflags "-X main.appVersion={{VERSION}}" -o ./bin/darwin-amd64/mdview
63-
cp mdview.1 bin/darwin-amd64/
64-
tar czvf mdview-{{VERSION}}-darwin-amd64.tar.gz --transform s/darwin-amd64/mdview-{{VERSION}}/ -C bin darwin-amd64
65-
66-
bin-darwin-arm64-mdview:
67-
env GOOS=darwin GOARCH=arm64 go build -ldflags "-X main.appVersion={{VERSION}}" -o ./bin/darwin-arm64/mdview
68-
cp mdview.1 bin/darwin-arm64/
69-
tar czvf mdview-{{VERSION}}-darwin-arm64.tar.gz --transform s/darwin-arm64/mdview-{{VERSION}}/ -C bin darwin-arm64
70-
71-
bin-freebsd-amd64-mdview:
72-
env GOOS=freebsd GOARCH=amd64 go build -ldflags "-X main.appVersion={{VERSION}}" -o ./bin/freebsd-amd64/mdview
73-
cp mdview.1 bin/freebsd-amd64/mdview
74-
tar czvf mdview-{{VERSION}}-freebsd-amd64.tar.gz --transform s/freebsd-amd64/mdview-{{VERSION}}/ -C bin freebsd-amd64
75-
7620
clean:
77-
rm -rf bin
78-
rm -rf package
79-
rm -f *.tar.gz
80-
rm -f *.zip
81-
rm -f *.deb
21+
rm -rf dist
8222
rm -f mdview.1
8323
rm -f *.snap
8424

0 commit comments

Comments
 (0)