# 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 on: push: tags: - "v*.*.*" - "!varcon*" env: BIN_NAME: typos # We need this to be able to create releases. permissions: contents: write jobs: create-release: name: create-release runs-on: ubuntu-latest outputs: tag: ${{ env.TAG }} steps: - name: Checkout repository uses: actions/checkout@v4 with: fetch-depth: 1 - 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 ${{ env.TAG }} --output notes-${{ env.TAG }}.md cat notes-${{ env.TAG }}.md - name: Create GitHub release env: GH_TOKEN: ${{ github.token }} run: gh release create $TAG --verify-tag --draft --title $TAG --notes-file notes-${{ env.TAG }}.md build-release: name: build-release needs: create-release strategy: fail-fast: false matrix: build: [linux, macos, win-msvc] include: - build: linux os: ubuntu-20.04 rust: stable target: x86_64-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-2019 rust: stable target: x86_64-pc-windows-msvc runs-on: ${{ matrix.os }} steps: - name: Checkout repository uses: actions/checkout@v4 with: fetch-depth: 1 - name: Install packages (Ubuntu) if: matrix.os == 'ubuntu-20.04' run: | sudo apt-get update sudo apt-get install -y --no-install-recommends xz-utils liblz4-tool musl-tools - name: Install Rust uses: dtolnay/rust-toolchain@stable with: toolchain: ${{ matrix.rust }} targets: ${{ matrix.target }} - 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-2019" ]; 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 - name: Upload release archive env: GH_TOKEN: ${{ github.token }} shell: bash run: | tag="${{ needs.create-release.outputs.tag }}" gh release upload "$tag" ${{ env.ASSET }} publish-release: name: Publish Release needs: [create-release, build-release] runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4 with: fetch-depth: 1 - name: Publish Release env: GH_TOKEN: ${{ github.token }} run: gh release edit "${{ needs.create-release.outputs.tag }}" --draft=false