# The way this works is the following: # # The create-release job runs purely to initialize the GitHub release itself # and to output upload_url for the following job. # # The build-release job runs only once create-release is finished. It gets the # release upload URL from create-release job outputs, then builds the release # executables for each supported platform and attaches them as release assets # to the previously created release. # # The key here is that we create the release only once. # # Reference: # https://eugene-babichenko.github.io/blog/2020/05/09/github-actions-cross-platform-auto-releases/ name: post-release permissions: contents: read on: push: tags: - "v*.*.*" - "!varcon*" env: BIN_NAME: typos jobs: create-release: permissions: contents: write name: create-release runs-on: ubuntu-latest outputs: tag: ${{ env.TAG }} steps: - name: Checkout repository uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 with: fetch-depth: 1 persist-credentials: false - name: Get the release version from the tag if: env.TAG == '' run: echo "TAG=${GITHUB_REF_NAME}" >> $GITHUB_ENV - name: Show the tag run: | echo "tag is: $TAG" - name: Generate Release Notes run: | ./.github/workflows/release-notes.py --tag ${TAG} --output notes-${TAG}.md cat notes-${TAG}.md - name: Create GitHub release env: GH_TOKEN: ${{ github.token }} run: gh release create $TAG --verify-tag --draft --title $TAG --notes-file notes-${TAG}.md build-release: permissions: contents: write name: build-release needs: create-release strategy: fail-fast: false matrix: build: [linux, linux-aarch64, macos, macos-aarch64, win-msvc] include: - build: linux os: ubuntu-22.04 rust: stable target: x86_64-unknown-linux-musl - build: linux-aarch64 os: ubuntu-24.04-arm rust: stable target: aarch64-unknown-linux-musl - build: macos os: macos-latest rust: stable target: x86_64-apple-darwin - build: macos-aarch64 os: macos-latest rust: stable target: aarch64-apple-darwin - build: win-msvc os: windows-2022 rust: stable target: x86_64-pc-windows-msvc runs-on: ${{ matrix.os }} steps: - name: Checkout repository uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 with: fetch-depth: 1 persist-credentials: false - name: Install packages (Ubuntu) if: matrix.build == 'linux' || matrix.build == 'linux-aarch64' run: | sudo apt-get update sudo apt-get install -y --no-install-recommends xz-utils liblz4-tool musl-tools - name: Install Rust run: rustup toolchain install ${{ matrix.rust }} --target ${{ matrix.target }} && rustup default ${{ matrix.rust }} - name: Build release binary run: cargo build --target ${{ matrix.target }} --verbose --release - name: Build archive shell: bash run: | outdir="./target/${{ matrix.target }}/release" staging="${{ env.BIN_NAME }}-${NEEDS_CREATE_RELEASE_OUTPUTS_TAG}-${{ matrix.target }}" mkdir -p "$staging"/doc cp {README.md,LICENSE-*} "$staging/" cp {CHANGELOG.md,docs/*} "$staging/doc/" if [ "${{ matrix.os }}" = "windows-2022" ]; then cp "target/${{ matrix.target }}/release/${{ env.BIN_NAME }}.exe" "$staging/" ls -l "$staging" cd "$staging" 7z a "../$staging.zip" . echo "ASSET=$staging.zip" >> $GITHUB_ENV else cp "target/${{ matrix.target }}/release/${{ env.BIN_NAME }}" "$staging/" ls -l "$staging" tar czf "$staging.tar.gz" -C "$staging" . echo "ASSET=$staging.tar.gz" >> $GITHUB_ENV fi env: NEEDS_CREATE_RELEASE_OUTPUTS_TAG: ${{ needs.create-release.outputs.tag }} - name: Upload release archive env: GH_TOKEN: ${{ github.token }} NEEDS_CREATE_RELEASE_OUTPUTS_TAG: ${{ needs.create-release.outputs.tag }} shell: bash run: | tag="${NEEDS_CREATE_RELEASE_OUTPUTS_TAG}" gh release upload "$tag" ${ASSET} publish-release: permissions: contents: write name: Publish Release needs: [create-release, build-release] runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 with: fetch-depth: 1 persist-credentials: false - name: Publish Release env: GH_TOKEN: ${{ github.token }} NEEDS_CREATE_RELEASE_OUTPUTS_TAG: ${{ needs.create-release.outputs.tag }} run: gh release edit "${NEEDS_CREATE_RELEASE_OUTPUTS_TAG}" --draft=false