name: release on: push: tags: - 'v*' workflow_dispatch: inputs: tag: description: 'Release tag (e.g. v1.2.3). If empty, uses current ref name.' required: false type: string build_targets: description: 'Space-separated GOOS/GOARCH targets. Leave empty to use Makefile defaults.' required: false type: string channel_variants: description: 'Space-separated package variants. Leave empty to use full none and all single-channel variants.' required: false type: string permissions: contents: write jobs: build-and-package: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Go uses: actions/setup-go@v5 with: go-version-file: go.mod cache: true - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '20' cache: 'npm' cache-dependency-path: webui/package-lock.json - name: Install packaging tools run: | sudo apt-get update sudo apt-get install -y zip - name: Resolve build version id: ver run: | if [ "${{ github.event_name }}" = "workflow_dispatch" ] && [ -n "${{ inputs.tag }}" ]; then raw="${{ inputs.tag }}" elif [[ "${GITHUB_REF}" == refs/tags/* ]]; then raw="${GITHUB_REF_NAME}" else raw="$(git describe --tags --always --dirty 2>/dev/null || echo dev)" fi version="${raw#v}" echo "raw=$raw" >> "$GITHUB_OUTPUT" echo "version=$version" >> "$GITHUB_OUTPUT" echo "Build version: $version (from $raw)" - name: Build and package release artifacts run: | set -euo pipefail make clean build_targets="${{ inputs.build_targets || '' }}" channel_variants="${{ inputs.channel_variants || '' }}" if [ -z "$build_targets" ]; then build_targets="linux/amd64 linux/arm64 linux/riscv64 darwin/amd64 darwin/arm64 windows/amd64 windows/arm64" fi if [ -z "$channel_variants" ]; then channel_variants="full none telegram discord feishu maixcam qq dingtalk whatsapp" fi echo "BUILD_TARGETS=$build_targets" echo "CHANNEL_PACKAGE_VARIANTS=$channel_variants" make package-all VERSION="${{ steps.ver.outputs.version }}" BUILD_TARGETS="$build_targets" CHANNEL_PACKAGE_VARIANTS="$channel_variants" - name: Upload artifacts uses: actions/upload-artifact@v4 with: name: release-artifacts path: build if-no-files-found: error publish-release: needs: build-and-package runs-on: ubuntu-latest if: startsWith(github.ref, 'refs/tags/') || github.event_name == 'workflow_dispatch' steps: - name: Download artifacts uses: actions/download-artifact@v4 with: name: release-artifacts path: build - name: List downloaded artifacts run: find build -maxdepth 4 -type f | sort - name: Resolve tag id: tag run: | if [ "${{ github.event_name }}" = "workflow_dispatch" ] && [ -n "${{ inputs.tag }}" ]; then echo "name=${{ inputs.tag }}" >> "$GITHUB_OUTPUT" else echo "name=${GITHUB_REF_NAME}" >> "$GITHUB_OUTPUT" fi - name: Create GitHub Release uses: softprops/action-gh-release@v2 with: tag_name: ${{ steps.tag.outputs.name }} name: ${{ steps.tag.outputs.name }} generate_release_notes: true files: | build/**/*.tar.gz build/**/*.zip build/**/checksums.txt