Files
VoiletSshTools/.github/workflows/release.yml
T
liyp 4298611c2c
Release / End-to-end tests (push) Canceled after 0s
Release / Build and publish (push) Canceled after 0s
ci: 打 v* tag 时自动构建六平台二进制并挂到 GitHub Release
- test job 先跑 golink (38) 与 goscp (19) 两套端到端测试
- release job 用 build.sh 交叉编译,校验版本号与 SHA256SUMS
- gh release create/upload 推送 13 个附件,支持 workflow_dispatch 重建
2026-10-23 13:03:19 +08:00

102 lines
2.6 KiB
YAML

name: Release
# A pushed v* tag makes this workflow build every desktop target, run the
# end-to-end suites and attach the binaries to the matching GitHub release.
# workflow_dispatch lets an existing tag be rebuilt without moving it.
on:
push:
tags:
- "v*"
workflow_dispatch:
inputs:
tag:
description: "Tag to build and publish (for example v1.0.1)"
required: true
type: string
permissions:
contents: write
concurrency:
group: release-${{ github.ref }}
cancel-in-progress: false
jobs:
test:
name: End-to-end tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version-file: go.mod
cache: true
- name: golink suite
run: ./smoketest/run.sh
- name: goscp suite
run: ./smoketest/run-goscp.sh
release:
name: Build and publish
needs: test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version-file: go.mod
cache: true
- name: Resolve tag
id: tag
env:
DISPATCH_TAG: ${{ inputs.tag }}
PUSHED_TAG: ${{ github.ref_name }}
run: |
set -euo pipefail
tag="${DISPATCH_TAG:-$PUSHED_TAG}"
echo "value=$tag" >> "$GITHUB_OUTPUT"
echo "building $tag"
- name: Build every target
env:
TAG: ${{ steps.tag.outputs.value }}
run: |
set -euo pipefail
VERSION="${TAG#v}" ./build.sh
- name: Verify the binaries
env:
TAG: ${{ steps.tag.outputs.value }}
run: |
set -euo pipefail
want="${TAG#v}"
for program in golink goscp; do
got="$(./dist/$program -version | awk '{print $2}')"
echo "$program: $got"
[ "$got" = "$want" ] || { echo "version mismatch: want $want, got $got" >&2; exit 1; }
done
sha256sum -c dist/SHA256SUMS
- name: Publish to the release
env:
GH_TOKEN: ${{ github.token }}
TAG: ${{ steps.tag.outputs.value }}
run: |
set -euo pipefail
if gh release view "$TAG" >/dev/null 2>&1; then
echo "release $TAG already exists, replacing assets"
else
gh release create "$TAG" \
--title "sshtools $TAG" \
--generate-notes \
--verify-tag
fi
gh release upload "$TAG" dist/golink_* dist/goscp_* dist/SHA256SUMS --clobber
gh release view "$TAG"