Skip to content

Commit 0c755d5

Browse files
skibitskyclaude
andcommitted
Add Homebrew distribution via CI release pipeline
- Add package metadata to Cargo.toml (description, license, homepage, repository) - Add --version / -v flag - Add release workflow: builds macOS arm64/x86_64 + Linux x86_64 binaries, creates GitHub Release, and updates skibitsky/homebrew-tap formula Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent fed69f8 commit 0c755d5

3 files changed

Lines changed: 150 additions & 0 deletions

File tree

.github/workflows/release.yml

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
name: Release
2+
3+
on:
4+
push:
5+
tags:
6+
- "v*"
7+
8+
permissions:
9+
contents: write
10+
11+
env:
12+
CARGO_TERM_COLOR: always
13+
14+
jobs:
15+
build:
16+
strategy:
17+
matrix:
18+
include:
19+
- target: aarch64-apple-darwin
20+
os: macos-latest
21+
- target: x86_64-apple-darwin
22+
os: macos-latest
23+
- target: x86_64-unknown-linux-gnu
24+
os: ubuntu-latest
25+
runs-on: ${{ matrix.os }}
26+
steps:
27+
- uses: actions/checkout@v4
28+
29+
- name: Install Rust
30+
uses: dtolnay/rust-toolchain@stable
31+
with:
32+
targets: ${{ matrix.target }}
33+
34+
- name: Build
35+
run: cargo build --release --target ${{ matrix.target }}
36+
37+
- name: Package
38+
run: |
39+
cd target/${{ matrix.target }}/release
40+
tar czf ../../../mdview-${{ matrix.target }}.tar.gz mdview
41+
cd ../../..
42+
43+
- name: Upload artifact
44+
uses: actions/upload-artifact@v4
45+
with:
46+
name: mdview-${{ matrix.target }}
47+
path: mdview-${{ matrix.target }}.tar.gz
48+
49+
release:
50+
needs: build
51+
runs-on: ubuntu-latest
52+
outputs:
53+
version: ${{ steps.version.outputs.version }}
54+
steps:
55+
- name: Get version from tag
56+
id: version
57+
run: echo "version=${GITHUB_REF#refs/tags/v}" >> "$GITHUB_OUTPUT"
58+
59+
- name: Download artifacts
60+
uses: actions/download-artifact@v4
61+
with:
62+
merge-multiple: true
63+
64+
- name: Create GitHub Release
65+
uses: softprops/action-gh-release@v2
66+
with:
67+
generate_release_notes: true
68+
files: mdview-*.tar.gz
69+
70+
update-tap:
71+
needs: release
72+
runs-on: ubuntu-latest
73+
steps:
74+
- name: Download artifacts
75+
uses: actions/download-artifact@v4
76+
with:
77+
merge-multiple: true
78+
79+
- name: Compute SHA256 sums
80+
id: sha
81+
run: |
82+
echo "aarch64_apple=$(sha256sum mdview-aarch64-apple-darwin.tar.gz | awk '{print $1}')" >> "$GITHUB_OUTPUT"
83+
echo "x86_64_apple=$(sha256sum mdview-x86_64-apple-darwin.tar.gz | awk '{print $1}')" >> "$GITHUB_OUTPUT"
84+
echo "x86_64_linux=$(sha256sum mdview-x86_64-unknown-linux-gnu.tar.gz | awk '{print $1}')" >> "$GITHUB_OUTPUT"
85+
86+
- name: Update Homebrew formula
87+
env:
88+
TAP_TOKEN: ${{ secrets.TAP_TOKEN }}
89+
run: |
90+
VERSION="${{ needs.release.outputs.version }}"
91+
BASE_URL="https://github.com/skibitsky/mdview/releases/download/v${VERSION}"
92+
93+
cat > mdview.rb << FORMULA
94+
class Mdview < Formula
95+
desc "A terminal markdown viewer"
96+
homepage "https://github.com/skibitsky/mdview"
97+
version "${VERSION}"
98+
license "MIT"
99+
100+
on_macos do
101+
if Hardware::CPU.arm?
102+
url "${BASE_URL}/mdview-aarch64-apple-darwin.tar.gz"
103+
sha256 "${{ steps.sha.outputs.aarch64_apple }}"
104+
else
105+
url "${BASE_URL}/mdview-x86_64-apple-darwin.tar.gz"
106+
sha256 "${{ steps.sha.outputs.x86_64_apple }}"
107+
end
108+
end
109+
110+
on_linux do
111+
url "${BASE_URL}/mdview-x86_64-unknown-linux-gnu.tar.gz"
112+
sha256 "${{ steps.sha.outputs.x86_64_linux }}"
113+
end
114+
115+
def install
116+
bin.install "mdview"
117+
end
118+
119+
test do
120+
assert_match version.to_s, shell_output("#{bin}/mdview --version")
121+
end
122+
end
123+
FORMULA
124+
125+
# Remove leading whitespace from heredoc
126+
sed -i 's/^ //' mdview.rb
127+
128+
# Push to homebrew-tap repo
129+
git clone "https://x-access-token:${TAP_TOKEN}@github.com/skibitsky/homebrew-tap.git" tap
130+
mkdir -p tap/Formula
131+
cp mdview.rb tap/Formula/mdview.rb
132+
cd tap
133+
git config user.name "github-actions[bot]"
134+
git config user.email "github-actions[bot]@users.noreply.github.com"
135+
git add Formula/mdview.rb
136+
if git diff --cached --quiet; then
137+
echo "Formula unchanged, skipping commit"
138+
else
139+
git commit -m "Update mdview to ${VERSION}"
140+
git push
141+
fi

Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22
name = "mdview"
33
version = "0.1.0"
44
edition = "2024"
5+
description = "A terminal markdown viewer"
6+
license = "MIT"
7+
homepage = "https://github.com/skibitsky/mdview"
8+
repository = "https://github.com/skibitsky/mdview"
59

610
[dependencies]
711
anyhow = "1"

src/main.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,11 @@ impl App {
5959
fn main() -> Result<()> {
6060
let args: Vec<String> = std::env::args().collect();
6161

62+
if args.iter().any(|a| a == "--version" || a == "-v") {
63+
println!("mdview {}", env!("CARGO_PKG_VERSION"));
64+
return Ok(());
65+
}
66+
6267
let dump = args.iter().any(|a| a == "--dump");
6368
let width_override = args.iter()
6469
.position(|a| a == "-w" || a == "--width")

0 commit comments

Comments
 (0)