1 name: GitHub Release
2
3 on:
4 push:
5 tags:
6 - "v*.*.*"
7 workflow_dispatch:
8 inputs:
9 tag:
10 description: "Release tag (e.g. v0.1.1)"
11 required: true
12
13 permissions:
14 contents: write
15 actions: write
16
17 env:
18 PROJECT_NAME: sigit
19 CARGO_TERM_COLOR: always
20
21 jobs:
22 build:
23 name: Build binary (${{ matrix.name }})
24 runs-on: ${{ matrix.runner }}
25
26 strategy:
27 fail-fast: false
28 matrix:
29 include:
30 - name: linux-amd64
31 runner: ubuntu-latest
32 target: x86_64-unknown-linux-gnu
33 - name: linux-arm64
34 runner: ubuntu-24.04-arm
35 target: aarch64-unknown-linux-gnu
36 - name: win-amd64
37 runner: windows-latest
38 target: x86_64-pc-windows-msvc
39 - name: win-arm64
40 runner: windows-latest
41 target: aarch64-pc-windows-msvc
42 - name: macos-amd64
43 runner: macos-26
44 target: x86_64-apple-darwin
45 - name: macos-arm64
46 runner: macos-26
47 target: aarch64-apple-darwin
48
49 steps:
50 - name: Checkout
51 uses: actions/checkout@v6
52 with:
53 ref: ${{ github.event.inputs.tag || github.ref }}
54
55 - name: Set the release version
56 shell: bash
57 run: |
58 if [[ "${GITHUB_REF_TYPE}" == "tag" ]]; then
59 release_version="${GITHUB_REF_NAME#v}"
60 else
61 release_version="${{ github.event.inputs.tag }}"
62 release_version="${release_version#v}"
63 fi
64 echo "RELEASE_VERSION=${release_version}" >> "$GITHUB_ENV"
65
66 - name: Read Rust toolchain
67 shell: bash
68 run: |
69 rust_toolchain="$(sed -n 's/^channel = "\(.*\)"/\1/p' rust-toolchain.toml | head -n 1)"
70 if [ -z "$rust_toolchain" ]; then
71 echo "Failed to read Rust toolchain from rust-toolchain.toml" >&2
72 exit 1
73 fi
74 echo "RUST_TOOLCHAIN=${rust_toolchain}" >> "$GITHUB_ENV"
75
76 - name: Install Rust toolchain
77 uses: dtolnay/rust-toolchain@3c5f7ea28cd621ae0bf5283f0e981fb97b8a7af9
78 with:
79 toolchain: ${{ env.RUST_TOOLCHAIN }}
80 targets: ${{ matrix.target }}
81
82 - name: Setup Rust cache
83 uses: Swatinem/rust-cache@v2
84 with:
85 key: github-${{ matrix.target }}
86
87 - name: Build binary
88 shell: bash
89 run: cargo build --locked --release --target ${{ matrix.target }}
90
91 - name: Package binary
92 shell: bash
93 run: |
94 BIN_SUFFIX=""
95 if [[ "${{ matrix.runner }}" == "windows-latest" ]]; then
96 BIN_SUFFIX=".exe"
97 fi
98
99 BIN_OUTPUT="target/${{ matrix.target }}/release/${PROJECT_NAME}${BIN_SUFFIX}"
100 BIN_RELEASE="${PROJECT_NAME}-${{ matrix.name }}${BIN_SUFFIX}"
101
102 mkdir -p ./release
103 mv "${BIN_OUTPUT}" "./release/${BIN_RELEASE}"
104
105 - name: Package macOS tarball for Homebrew
106 if: contains(matrix.target, 'apple-darwin')
107 shell: bash
108 run: |
109 ARCHIVE_NAME="${PROJECT_NAME}-${{ matrix.name }}.tar.gz"
110
111 mkdir -p staging-brew
112 cp "./release/${PROJECT_NAME}-${{ matrix.name }}" "staging-brew/${PROJECT_NAME}"
113 strip "staging-brew/${PROJECT_NAME}"
114
115 tar -C staging-brew -czf "${ARCHIVE_NAME}" "${PROJECT_NAME}"
116
117 shasum -a 256 "${ARCHIVE_NAME}" | awk '{print $1}' > "${ARCHIVE_NAME}.sha256"
118
119 echo "Archive: ${ARCHIVE_NAME}"
120 echo "SHA256: $(cat "${ARCHIVE_NAME}.sha256")"
121
122 - name: Upload binary artifact
123 uses: actions/upload-artifact@v4
124 with:
125 name: binary-${{ matrix.name }}
126 path: release/*
127
128 - name: Upload macOS Homebrew artifacts
129 if: contains(matrix.target, 'apple-darwin')
130 uses: actions/upload-artifact@v4
131 with:
132 name: homebrew-${{ matrix.name }}
133 path: |
134 ${{ env.PROJECT_NAME }}-${{ matrix.name }}.tar.gz
135 ${{ env.PROJECT_NAME }}-${{ matrix.name }}.tar.gz.sha256
136
137 release:
138 name: Create GitHub Release
139 needs: build
140 runs-on: ubuntu-latest
141 if: github.ref_type == 'tag' || github.event_name == 'workflow_dispatch'
142
143 steps:
144 - name: Resolve tag
145 id: tag
146 shell: bash
147 run: |
148 if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
149 echo "tag=${{ github.event.inputs.tag }}" >> "$GITHUB_OUTPUT"
150 else
151 echo "tag=${{ github.ref_name }}" >> "$GITHUB_OUTPUT"
152 fi
153
154 - name: Download binary artifacts
155 uses: actions/download-artifact@v4
156 with:
157 pattern: "binary-*"
158 path: release
159 merge-multiple: true
160
161 - name: Download Homebrew artifacts
162 uses: actions/download-artifact@v4
163 with:
164 pattern: "homebrew-*"
165 path: release
166 merge-multiple: true
167
168 - name: Release
169 uses: softprops/action-gh-release@v2
170 with:
171 tag_name: ${{ steps.tag.outputs.tag }}
172 files: release/*
173
174 - name: Trigger Homebrew release
175 uses: actions/github-script@v7
176 with:
177 script: |
178 await github.rest.actions.createWorkflowDispatch({
179 owner: context.repo.owner,
180 repo: context.repo.repo,
181 workflow_id: 'release-homebrew.yml',
182 ref: 'main',
183 inputs: {
184 tag: '${{ steps.tag.outputs.tag }}'
185 }
186 })
187 console.log('Dispatched release-homebrew.yml for tag ${{ steps.tag.outputs.tag }}')