diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6225673..202da0d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -8,12 +8,8 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v7 - - name: 'Get Previous tag' - id: previoustag - uses: "WyriHaximus/github-action-get-previous-tag@v2" - - name: Set version - run: | - export VERSION=${{ steps.previoustag.outputs.tag }} + with: + fetch-depth: 0 - name: Setup tools run: sudo apt-get install pandoc - name: Set up Go @@ -22,6 +18,9 @@ jobs: go-version-file: 'go.mod' - name: Install just uses: extractions/setup-just@v4 + - name: Install goreleaser + uses: goreleaser/goreleaser-action@v6 + with: + install-only: true - name: Build - run: VERSION="${{ steps.previoustag.outputs.tag }}" just all - + run: just build diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6e3179e..693d111 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,9 +13,8 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v7 - - name: 'Get Previous tag' - id: previoustag - uses: "WyriHaximus/github-action-get-previous-tag@v2" + with: + fetch-depth: 0 - name: Setup tools run: sudo apt-get install pandoc - name: Set up Go @@ -24,24 +23,11 @@ jobs: go-version-file: 'go.mod' - name: Install just uses: extractions/setup-just@v4 - - name: Build - run: | - VERSION="${{ steps.previoustag.outputs.tag }}" just all - VERSION="${{ steps.previoustag.outputs.tag }}" just deb - - name: Release - uses: softprops/action-gh-release@v2 + - name: Install goreleaser + uses: goreleaser/goreleaser-action@v6 with: - draft: true - prerelease: false - name: ${{ steps.previoustag.outputs.tag }} - tag_name: ${{ steps.previoustag.outputs.tag }} - files: | - mdview-${{ steps.previoustag.outputs.tag }}-linux-amd64.tar.gz - mdview-${{ steps.previoustag.outputs.tag }}-linux-i386.tar.gz - mdview-${{ steps.previoustag.outputs.tag }}-linux-arm64.tar.gz - mdview-${{ steps.previoustag.outputs.tag }}-darwin-amd64.tar.gz - mdview-${{ steps.previoustag.outputs.tag }}-darwin-arm64.tar.gz - mdview-${{ steps.previoustag.outputs.tag }}-windows-amd64.zip - mdview-${{ steps.previoustag.outputs.tag }}-freebsd-amd64.tar.gz - mdview_${{ steps.previoustag.outputs.tag }}_amd64.deb - mdview_${{ steps.previoustag.outputs.tag }}_arm64.deb \ No newline at end of file + install-only: true + - name: Release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: just release diff --git a/.gitignore b/.gitignore index 8f0c1f9..ed7122d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,15 +1,13 @@ -bin/* mdview mdview.exe +dist/ *.tar.gz -freebsd-amd64.tar.gz -linux-amd64.tar.gz *.zip prime/ parts/ .snapcraft *.snap -package/* *.deb +*.rpm mdview.1 mise.toml diff --git a/.goreleaser.yaml b/.goreleaser.yaml new file mode 100644 index 0000000..af29cfe --- /dev/null +++ b/.goreleaser.yaml @@ -0,0 +1,78 @@ +version: 2 + +before: + hooks: + - just manpage + +builds: + - id: mdview + main: . + binary: mdview + ldflags: + - -s -w -X main.appVersion={{.Version}} + goos: + - linux + - windows + - darwin + - freebsd + goarch: + - amd64 + - arm64 + ignore: + - goos: windows + goarch: arm64 + - goos: freebsd + goarch: arm64 + + - id: mdview-linux-386 + main: . + binary: mdview + ldflags: + - -s -w -X main.appVersion={{.Version}} + goos: + - linux + goarch: + - "386" + +archives: + - id: mdview + ids: + - mdview + - mdview-linux-386 + name_template: "mdview-{{.Version}}-{{.Os}}-{{.Arch}}" + formats: + - tar.gz + format_overrides: + - goos: windows + formats: + - zip + files: + - mdview.1 + +nfpms: + - id: mdview + ids: + - mdview + package_name: mdview + file_name_template: "mdview_{{.Version}}_{{.Arch}}" + vendor: bugzapperlabs.com + maintainer: bugzapperlabs.com + description: "Markdown View - Command line utility to format markdown and launch it in a browser." + section: custom + priority: optional + formats: + - deb + - rpm + bindir: /usr/bin + contents: + - src: mdview.1 + dst: /usr/share/man/man1/mdview.1 + +checksum: + name_template: "checksums.txt" + +release: + draft: true + +changelog: + disable: true diff --git a/CLAUDE.md b/CLAUDE.md index 1b70108..db99807 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -10,18 +10,21 @@ no other Go source files and no test files currently in the repo. ## Build & run -Requires Go (see `go.mod`/`mise.toml` for version) and, for packaging targets, `just` and `pandoc`. +Requires Go (see `go.mod`/`mise.toml` for version) and, for packaging, `just`, `pandoc`, and +[`goreleaser`](https://goreleaser.com/). - Quick local build: `go build` (produces `./mdview`) - Run directly without building: `go run . ` -- Full cross-platform build via `just` (uses `justfile`, the project's task runner — replaced the old Makefile): - - `just` or `just linux` — Linux amd64/arm64/i386 builds - - `just all` — linux + windows + darwin + freebsd - - `just deb` — build `.deb` packages (requires a prior linux build) - - `just snap` — build snap package via `snapcraft` - - `just clean` — remove build artifacts - - 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. - - `just manpage` regenerates `mdview.1` from `mdview.1.md` via pandoc. +- Full cross-platform build + packaging via `just` (uses `justfile`, which thinly wraps + `goreleaser`; config lives in `.goreleaser.yaml`): + - `just` or `just build` — cross-compiles all platform binaries via `goreleaser build --snapshot` (linux amd64/arm64/386, windows amd64, darwin amd64/arm64, freebsd amd64) + - `just release-snapshot` — full local dry run producing archives + `.deb`/`.rpm` packages in `dist/` without publishing + - `just release` — the real release (`goreleaser release --clean`); publishes a draft GitHub release, run from CI on tag push + - `just check` — validates `.goreleaser.yaml` + - `just snap` — build snap package via `snapcraft` (kept separate; goreleaser doesn't build snaps) + - `just clean` — remove build artifacts (`dist/`, `mdview.1`, `*.snap`) + - `just manpage` regenerates `mdview.1` from `mdview.1.md` via pandoc; goreleaser runs this automatically as a `before.hooks` step. + - 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. - There is no test suite and no lint target configured; `go vet ./...` and `gofmt` are reasonable sanity checks before committing. ## Architecture @@ -46,8 +49,13 @@ Output location resolution order: `MDVIEW_DIR` env var → (if running as a Snap ### Packaging -`justfile`, `control` (Debian control file template, `VERSION` substituted at build time), `mdview.1.md` -(man page source) and `snap/` all support the release pipeline in `.github/workflows/release.yml`, -which triggers on tag push, builds all platform targets + deb packages via `just`, and publishes a -draft GitHub release with `softprops/action-gh-release`. `.github/workflows/build.yml` runs the same -`just all` build on every push as a CI check (no tests to run). +`.goreleaser.yaml` drives cross-platform binary builds, archives (`.tar.gz`/`.zip`), and `.deb`/ +`.rpm` packages (via goreleaser's built-in `nfpm` integration — no more hand-rolled `control` file +or `dpkg-deb` invocation). `justfile` wraps the `goreleaser` CLI so `just ` stays the single +local entry point. `mdview.1.md` (man page source) and `snap/` (built separately via `just snap`, +outside goreleaser) round out packaging. + +`.github/workflows/release.yml` triggers on tag push, runs `just release`, and publishes a draft +GitHub release (goreleaser reads the version straight from the pushed git tag — no more +previous-tag lookup step). `.github/workflows/build.yml` runs `just build` (a `goreleaser build +--snapshot`) on every push as a CI sanity check (no tests to run). diff --git a/README.md b/README.md index c6cb7d2..472bce0 100644 --- a/README.md +++ b/README.md @@ -96,6 +96,25 @@ To remove the package: sudo dpkg --remove mdview ``` +### RPM Package + +If you're running Fedora or another RPM-based distro, download the package and +install it from the [Releases](https://github.com/mapitman/mdview/releases) page. + +```sh +curl -s https://api.github.com/repos/mapitman/mdview/releases/latest \ +| grep "browser_download_url.*amd64.rpm" \ +| cut -d '"' -f 4 \ +| xargs curl -L -o mdview_lastest_amd64.rpm +sudo rpm -i mdview_lastest_amd64.rpm +``` + +To remove the package: + +```sh +sudo rpm -e mdview +``` + ### Snap Package _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? ### Manual Download and Install Grab the correct binary for your operating system -[here](https://github.com/mapitman/mdview/releases/). +[here](https://github.com/mapitman/mdview/releases/). Linux, macOS, Windows, and FreeBSD +binaries are all published with every release. ### Compile Yourself If you have Golang installed... ```sh -go get github.com/mapitman/mdview +go install github.com/mapitman/mdview@latest ``` Don't have Golang? [Get it now](https://golang.org/doc/install). diff --git a/control b/control deleted file mode 100644 index 8fce2f2..0000000 --- a/control +++ /dev/null @@ -1,10 +0,0 @@ -Package: mdview -Version: VERSION -Section: custom -Priority: optional -Architecture: all -Essential: no -Installed-Size: 4096 -Maintainer: bugzapperlabs.com -Description: Markdown View - Command line utility to format markdown and launch it in a browser. - diff --git a/justfile b/justfile index 011b5ac..506033f 100644 --- a/justfile +++ b/justfile @@ -1,84 +1,24 @@ set shell := ["/bin/bash", "-c"] -VERSION := env_var_or_default("VERSION", "") +default: build -MANSECTION := env_var_or_default("MANSECTION", "1") +check: + goreleaser check -default: linux -all: linux windows darwin freebsd +build: + goreleaser build --snapshot --clean -linux: bin-linux-amd64-mdview bin-linux-arm64-mdview bin-linux-i386-mdview -windows: bin-windows-amd64-mdview-exe -darwin: bin-darwin-amd64-mdview bin-darwin-arm64-mdview -freebsd: bin-freebsd-amd64-mdview +release-snapshot: + goreleaser release --snapshot --clean --skip=publish -deb: deb-linux-amd64 deb-linux-arm64 - -deb-linux-amd64: bin-linux-amd64-mdview - mkdir -p package/DEBIAN - mkdir -p package/usr/bin/ - mkdir -p package/usr/share/man/man1/ - cp control package/DEBIAN/ - sed -i "s/VERSION/{{VERSION}}/g" package/DEBIAN/control - cp -r bin/linux-amd64/mdview package/usr/bin/mdview - cp mdview.1 package/usr/share/man/man1/ - dpkg-deb --build package - mv package.deb mdview_{{VERSION}}_amd64.deb - -deb-linux-arm64: bin-linux-arm64-mdview - mkdir -p package/DEBIAN - mkdir -p package/usr/bin/ - mkdir -p package/usr/share/man/man1/ - cp control package/DEBIAN/ - sed -i "s/VERSION/{{VERSION}}/g" package/DEBIAN/control - cp -r bin/linux-arm64/mdview package/usr/bin/mdview - cp mdview.1 package/usr/share/man/man1/ - dpkg-deb --build package - mv package.deb mdview_{{VERSION}}_arm64.deb +release: + goreleaser release --clean snap: snapcraft pack -bin-linux-amd64-mdview: manpage - env GOOS=linux GOARCH=amd64 go build -ldflags "-X main.appVersion={{VERSION}}" -o ./bin/linux-amd64/mdview - cp mdview.1 bin/linux-amd64/ - tar czvf mdview-{{VERSION}}-linux-amd64.tar.gz --transform s/linux-amd64/mdview-{{VERSION}}/ -C bin linux-amd64 - -bin-linux-i386-mdview: - env GOOS=linux GOARCH=386 go build -ldflags "-X main.appVersion={{VERSION}}" -o ./bin/linux-i386/mdview - cp mdview.1 bin/linux-i386/ - tar czvf mdview-{{VERSION}}-linux-i386.tar.gz --transform s/linux-i386/mdview-{{VERSION}}/ -C bin linux-i386 - -bin-linux-arm64-mdview: - env GOOS=linux GOARCH=arm64 go build -ldflags "-X main.appVersion={{VERSION}}" -o ./bin/linux-arm64/mdview - cp mdview.1 bin/linux-arm64/ - tar czvf mdview-{{VERSION}}-linux-arm64.tar.gz --transform s/linux-arm64/mdview-{{VERSION}}/ -C bin linux-arm64 - -bin-windows-amd64-mdview-exe: - env GOOS=windows GOARCH=amd64 go build -ldflags "-X main.appVersion={{VERSION}}" -o ./bin/windows-amd64/mdview.exe - zip -j mdview-{{VERSION}}-windows-amd64.zip bin/windows-amd64/mdview.exe - -bin-darwin-amd64-mdview: - env GOOS=darwin GOARCH=amd64 go build -ldflags "-X main.appVersion={{VERSION}}" -o ./bin/darwin-amd64/mdview - cp mdview.1 bin/darwin-amd64/ - tar czvf mdview-{{VERSION}}-darwin-amd64.tar.gz --transform s/darwin-amd64/mdview-{{VERSION}}/ -C bin darwin-amd64 - -bin-darwin-arm64-mdview: - env GOOS=darwin GOARCH=arm64 go build -ldflags "-X main.appVersion={{VERSION}}" -o ./bin/darwin-arm64/mdview - cp mdview.1 bin/darwin-arm64/ - tar czvf mdview-{{VERSION}}-darwin-arm64.tar.gz --transform s/darwin-arm64/mdview-{{VERSION}}/ -C bin darwin-arm64 - -bin-freebsd-amd64-mdview: - env GOOS=freebsd GOARCH=amd64 go build -ldflags "-X main.appVersion={{VERSION}}" -o ./bin/freebsd-amd64/mdview - cp mdview.1 bin/freebsd-amd64/mdview - tar czvf mdview-{{VERSION}}-freebsd-amd64.tar.gz --transform s/freebsd-amd64/mdview-{{VERSION}}/ -C bin freebsd-amd64 - clean: - rm -rf bin - rm -rf package - rm -f *.tar.gz - rm -f *.zip - rm -f *.deb + rm -rf dist rm -f mdview.1 rm -f *.snap