@@ -2,7 +2,7 @@ name: Release
22
33on :
44 release :
5- types : [published]
5+ types : [published, prereleased ]
66 workflow_dispatch :
77 inputs :
88 update_homebrew :
9898 sudo apt update
9999 sudo apt install -y musl-tools
100100
101- # 5) Build release binaries (bssh and bssh-server )
101+ # 5) Build release binaries (bssh, bssh-server, and bssh-keygen )
102102 - name : Build release binaries
103- run : cargo build --release --target ${{ matrix.target }} --locked --bin bssh --bin bssh-server
103+ run : cargo build --release --target ${{ matrix.target }} --locked --bin bssh --bin bssh-server --bin bssh-keygen
104104
105105 # 6) macOS code signing
106106 - name : Import Distribution certificate
@@ -114,18 +114,19 @@ jobs:
114114 if : runner.os == 'macOS'
115115 run : |
116116 BIN_DIR=target/${{ matrix.target }}/release
117- for bin in bssh bssh-server; do
117+ for bin in bssh bssh-server bssh-keygen ; do
118118 codesign --force --timestamp --options runtime \
119119 --sign "Distribution" "$BIN_DIR/$bin"
120120 done
121121
122- # 7) Package binaries (separate packages for bssh and bssh-server )
122+ # 7) Package binaries (separate packages for bssh, bssh-server, and bssh-keygen )
123123 - name : Package Linux binaries (tar.gz)
124124 if : runner.os == 'Linux'
125125 run : |
126126 BIN_DIR=target/${{ matrix.target }}/release
127127 ASSET_BASE="${{ matrix.asset_name }}"
128128 SERVER_ASSET_BASE="${ASSET_BASE/bssh/bssh-server}"
129+ KEYGEN_ASSET_BASE="${ASSET_BASE/bssh/bssh-keygen}"
129130
130131 # Package bssh
131132 mkdir -p package-bssh
@@ -139,12 +140,19 @@ jobs:
139140 cp docs/man/bssh-server.8 package-bssh-server/
140141 tar -C package-bssh-server -czf "${SERVER_ASSET_BASE}.tar.gz" .
141142
143+ # Package bssh-keygen
144+ mkdir -p package-bssh-keygen
145+ cp "$BIN_DIR/bssh-keygen" package-bssh-keygen/
146+ cp docs/man/bssh-keygen.1 package-bssh-keygen/
147+ tar -C package-bssh-keygen -czf "${KEYGEN_ASSET_BASE}.tar.gz" .
148+
142149 - name : Package macOS binaries (zip)
143150 if : runner.os == 'macOS'
144151 run : |
145152 BIN_DIR="target/${{ matrix.target }}/release"
146153 ASSET_BASE="${{ matrix.asset_name }}"
147154 SERVER_ASSET_BASE="${ASSET_BASE/bssh/bssh-server}"
155+ KEYGEN_ASSET_BASE="${ASSET_BASE/bssh/bssh-keygen}"
148156
149157 # Package bssh
150158 mkdir -p package-bssh
@@ -158,14 +166,21 @@ jobs:
158166 cp docs/man/bssh-server.8 package-bssh-server/
159167 ditto -c -k --sequesterRsrc package-bssh-server "${SERVER_ASSET_BASE}.zip"
160168
169+ # Package bssh-keygen
170+ mkdir -p package-bssh-keygen
171+ cp "$BIN_DIR/bssh-keygen" package-bssh-keygen/
172+ cp docs/man/bssh-keygen.1 package-bssh-keygen/
173+ ditto -c -k --sequesterRsrc package-bssh-keygen "${KEYGEN_ASSET_BASE}.zip"
174+
161175 # 8) Generate checksums
162176 - name : Generate checksums
163177 run : |
164178 ASSET_BASE="${{ matrix.asset_name }}"
165179 SERVER_ASSET_BASE="${ASSET_BASE/bssh/bssh-server}"
180+ KEYGEN_ASSET_BASE="${ASSET_BASE/bssh/bssh-keygen}"
166181 EXT="${{ matrix.archive_ext }}"
167182
168- for file in "${ASSET_BASE}${EXT}" "${SERVER_ASSET_BASE}${EXT}"; do
183+ for file in "${ASSET_BASE}${EXT}" "${SERVER_ASSET_BASE}${EXT}" "${KEYGEN_ASSET_BASE}${EXT}" ; do
169184 if [[ "$RUNNER_OS" == "Linux" ]]; then
170185 sha256sum "$file" > "$file.sha256"
171186 else
@@ -179,6 +194,7 @@ jobs:
179194 run : |
180195 ASSET_BASE="${{ matrix.asset_name }}"
181196 SERVER_ASSET_BASE="${ASSET_BASE/bssh/bssh-server}"
197+ KEYGEN_ASSET_BASE="${ASSET_BASE/bssh/bssh-keygen}"
182198 EXT="${{ matrix.archive_ext }}"
183199 TAG="${{ github.event.release.tag_name || github.event.inputs.release_tag }}"
184200
@@ -187,10 +203,34 @@ jobs:
187203 "${ASSET_BASE}${EXT}.sha256" \
188204 "${SERVER_ASSET_BASE}${EXT}" \
189205 "${SERVER_ASSET_BASE}${EXT}.sha256" \
206+ "${KEYGEN_ASSET_BASE}${EXT}" \
207+ "${KEYGEN_ASSET_BASE}${EXT}.sha256" \
190208 --clobber
191209 env :
192210 GH_TOKEN : ${{ github.token }}
193211
212+ # ============================================================================
213+ # Publish pre-release as official release (after all builds complete)
214+ # ============================================================================
215+ publish-release :
216+ name : Publish pre-release as official
217+ needs : [build]
218+ if : github.event_name == 'release' && github.event.release.prerelease
219+ runs-on : ubuntu-latest
220+ permissions :
221+ contents : write
222+
223+ steps :
224+ - name : Checkout code
225+ uses : actions/checkout@v4
226+
227+ - name : Convert pre-release to official release
228+ run : |
229+ TAG="${{ github.event.release.tag_name }}"
230+ gh release edit "$TAG" --prerelease=false
231+ env :
232+ GH_TOKEN : ${{ secrets.GITHUB_TOKEN }}
233+
194234 # ============================================================================
195235 # Microsoft Teams release notification (Power Automate Workflows webhook)
196236 # ============================================================================
0 commit comments