release-server #7
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: release-server | |
| on: | |
| workflow_dispatch: | |
| inputs: | |
| release_tag: | |
| description: "Release tag to publish, for example v0.3.7. Leave empty for artifact-only manual builds." | |
| required: false | |
| type: string | |
| publish_release: | |
| description: "Create/update the GitHub Release and Docker image. Requires release_tag." | |
| required: false | |
| default: false | |
| type: boolean | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.event_name == 'push' && github.ref_name || inputs.release_tag || github.run_id }} | |
| cancel-in-progress: false | |
| permissions: | |
| contents: read | |
| env: | |
| CARGO_TERM_COLOR: always | |
| jobs: | |
| prepare: | |
| name: Prepare release | |
| runs-on: ubuntu-latest | |
| outputs: | |
| publish: ${{ steps.release.outputs.publish }} | |
| tag: ${{ steps.release.outputs.tag }} | |
| steps: | |
| - name: Resolve release mode | |
| id: release | |
| shell: bash | |
| run: | | |
| publish="false" | |
| tag="" | |
| # push tag 触发 → 自动发布;手动触发 → 读取 inputs | |
| if [[ "${GITHUB_EVENT_NAME}" == "push" ]]; then | |
| publish="true" | |
| tag="${GITHUB_REF_NAME}" | |
| else | |
| publish="${{ inputs.publish_release }}" | |
| tag="${{ inputs.release_tag }}" | |
| fi | |
| # 发布时校验 tag 格式:v + 语义版本,允许 pre-release 后缀如 -rc1, +build123 | |
| if [[ "${publish}" == "true" ]]; then | |
| if [[ ! "${tag}" =~ ^v[0-9]+(\.[0-9]+)*([-+][0-9A-Za-z.-]+)?$ ]]; then | |
| echo "release_tag must look like v0.3.7 when publishing" >&2 | |
| exit 1 | |
| fi | |
| fi | |
| echo "publish=${publish}" >> "${GITHUB_OUTPUT}" | |
| echo "tag=${tag}" >> "${GITHUB_OUTPUT}" | |
| build-linux: | |
| name: Build - ${{ matrix.platform.release_for }} | |
| needs: prepare | |
| runs-on: ubuntu-latest | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| platform: | |
| - release_for: linux_x86_64_musl | |
| target: x86_64-unknown-linux-musl | |
| binary_name: nodeget-server-linux-x86_64-musl | |
| - release_for: linux_x86_64_gnu | |
| target: x86_64-unknown-linux-gnu | |
| binary_name: nodeget-server-linux-x86_64-gnu | |
| - release_for: linux_arm_gnueabi | |
| target: arm-unknown-linux-gnueabi | |
| binary_name: nodeget-server-linux-arm-gnueabi | |
| - release_for: linux_arm_gnueabihf | |
| target: arm-unknown-linux-gnueabihf | |
| binary_name: nodeget-server-linux-arm-gnueabihf | |
| - release_for: linux_aarch64_gnu | |
| target: aarch64-unknown-linux-gnu | |
| binary_name: nodeget-server-linux-aarch64-gnu | |
| - release_for: linux_aarch64_musl | |
| target: aarch64-unknown-linux-musl | |
| binary_name: nodeget-server-linux-aarch64-musl | |
| - release_for: linux_armv7_gnueabi | |
| target: armv7-unknown-linux-gnueabi | |
| binary_name: nodeget-server-linux-armv7-gnueabi | |
| - release_for: linux_armv7_gnueabihf | |
| target: armv7-unknown-linux-gnueabihf | |
| binary_name: nodeget-server-linux-armv7-gnueabihf | |
| - release_for: linux_armv7_musleabi | |
| target: armv7-unknown-linux-musleabi | |
| binary_name: nodeget-server-linux-armv7-musleabi | |
| - release_for: linux_armv7_musleabihf | |
| target: armv7-unknown-linux-musleabihf | |
| binary_name: nodeget-server-linux-armv7-musleabihf | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v6 | |
| - name: Setup Rust | |
| uses: ./.github/actions/setup-rust | |
| with: | |
| cache-shared-key: release-linux-${{ matrix.platform.target }} | |
| - name: Install cross | |
| env: | |
| CROSS_VERSION: v0.2.5 | |
| GH_TOKEN: ${{ github.token }} | |
| run: | | |
| mkdir -p "${HOME}/.local/bin" | |
| gh release download "${CROSS_VERSION}" \ | |
| --repo cross-rs/cross \ | |
| --pattern cross-x86_64-unknown-linux-gnu.tar.gz \ | |
| -O - \ | |
| | tar -xz -C "${HOME}/.local/bin" | |
| echo "${HOME}/.local/bin" >> "${GITHUB_PATH}" | |
| - name: Build binary | |
| run: cross build --package nodeget-server --target ${{ matrix.platform.target }} --profile minimal --jobs 32 | |
| env: | |
| CROSS_NO_WARNINGS: 0 | |
| - name: Compress binary | |
| run: upx -9 ./target/${{ matrix.platform.target }}/minimal/nodeget-server | |
| - name: Rename binary | |
| run: cp target/${{ matrix.platform.target }}/minimal/nodeget-server target/${{ matrix.platform.target }}/minimal/${{ matrix.platform.binary_name }} | |
| - name: Upload binary | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: server-${{ matrix.platform.target }} | |
| path: target/${{ matrix.platform.target }}/minimal/${{ matrix.platform.binary_name }} | |
| if-no-files-found: error | |
| retention-days: 14 | |
| build-windows: | |
| name: Build - ${{ matrix.platform.release_for }} | |
| needs: prepare | |
| runs-on: windows-latest | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| platform: | |
| - release_for: windows_x86_64 | |
| target: x86_64-pc-windows-msvc | |
| binary_name: nodeget-server-windows-x86_64.exe | |
| - release_for: windows_aarch64 | |
| target: aarch64-pc-windows-msvc | |
| binary_name: nodeget-server-windows-aarch64.exe | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v6 | |
| - name: Setup Rust | |
| uses: ./.github/actions/setup-rust | |
| with: | |
| targets: ${{ matrix.platform.target }} | |
| cache-shared-key: release-windows-${{ matrix.platform.target }} | |
| - name: Build binary | |
| run: cargo build --package nodeget-server --target ${{ matrix.platform.target }} --profile minimal --jobs 32 | |
| env: | |
| CROSS_NO_WARNINGS: 0 | |
| - name: Rename binary | |
| run: copy target\${{ matrix.platform.target }}\minimal\nodeget-server.exe target\${{ matrix.platform.target }}\minimal\${{ matrix.platform.binary_name }} | |
| - name: Upload binary | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: server-${{ matrix.platform.target }} | |
| path: target/${{ matrix.platform.target }}/minimal/${{ matrix.platform.binary_name }} | |
| if-no-files-found: error | |
| retention-days: 14 | |
| build-macos: | |
| name: Build - ${{ matrix.platform.release_for }} | |
| needs: prepare | |
| runs-on: macos-latest | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| platform: | |
| - release_for: macos_aarch64 | |
| target: aarch64-apple-darwin | |
| binary_name: nodeget-server-macos-aarch64 | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v6 | |
| - name: Setup Rust | |
| uses: ./.github/actions/setup-rust | |
| with: | |
| targets: ${{ matrix.platform.target }} | |
| cache-shared-key: release-macos-${{ matrix.platform.target }} | |
| - name: Build binary | |
| run: cargo build --package nodeget-server --target ${{ matrix.platform.target }} --profile minimal --jobs 32 | |
| env: | |
| CROSS_NO_WARNINGS: 0 | |
| - name: Rename binary | |
| run: cp target/${{ matrix.platform.target }}/minimal/nodeget-server target/${{ matrix.platform.target }}/minimal/${{ matrix.platform.binary_name }} | |
| - name: Upload binary | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: server-${{ matrix.platform.target }} | |
| path: target/${{ matrix.platform.target }}/minimal/${{ matrix.platform.binary_name }} | |
| if-no-files-found: error | |
| retention-days: 14 | |
| publish-release: | |
| name: Publish GitHub Release | |
| needs: | |
| - prepare | |
| - build-linux | |
| - build-windows | |
| - build-macos | |
| if: needs.prepare.outputs.publish == 'true' | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: write | |
| steps: | |
| - name: Download artifacts | |
| uses: actions/download-artifact@v8 | |
| with: | |
| path: dist | |
| merge-multiple: true | |
| - name: Upload release assets | |
| uses: softprops/action-gh-release@v3 | |
| with: | |
| tag_name: ${{ needs.prepare.outputs.tag }} | |
| name: NodeGet ${{ needs.prepare.outputs.tag }} | |
| make_latest: true | |
| files: dist/* |