# 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*" env: BIN_NAME: typos jobs: create-release: name: create-release runs-on: ubuntu-latest outputs: upload_url: ${{ steps.release.outputs.upload_url }} release_version: ${{ env.RELEASE_VERSION }} steps: - name: Get the release version from the tag shell: bash if: env.RELEASE_VERSION == '' run: | # See: https://github.community/t5/GitHub-Actions/How-to-get-just-the-tag-name/m-p/32167/highlight/true#M1027 echo "RELEASE_VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV echo "version is: ${{ env.RELEASE_VERSION }}" - name: Checkout repository uses: actions/checkout@v2 with: fetch-depth: 1 - name: Generate Release Notes run: | ./.github/workflows/release-notes.py --tag ${{ env.RELEASE_VERSION }} --output notes-${{ env.RELEASE_VERSION }}.md cat notes-${{ env.RELEASE_VERSION }}.md - name: Create GitHub release id: release uses: actions/create-release@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: tag_name: ${{ env.RELEASE_VERSION }} release_name: ${{ env.RELEASE_VERSION }} body_path: notes-${{ env.RELEASE_VERSION }}.md build-release: name: build-release needs: create-release strategy: fail-fast: false matrix: build: [linux, macos, win-msvc] include: - build: linux os: ubuntu-18.04 rust: stable target: x86_64-unknown-linux-musl - build: macos os: macos-latest rust: stable target: x86_64-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@v2 with: fetch-depth: 1 - name: Install packages (Ubuntu) if: matrix.os == 'ubuntu-18.04' run: | sudo apt-get update sudo apt-get install -y --no-install-recommends xz-utils liblz4-tool musl-tools - name: Install Rust uses: actions-rs/toolchain@v1 with: toolchain: ${{ matrix.rust }} profile: minimal override: true target: ${{ matrix.target }} - name: Build release binary run: cargo build --target ${{ matrix.target }} --verbose --release - name: Build archive shell: bash run: | outdir="./target/${{ env.TARGET_DIR }}/release" staging="${{ env.BIN_NAME }}-${{ needs.create-release.outputs.release_version }}-${{ matrix.target }}" mkdir -p "$staging"/{complete,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/" cd "$staging" 7z a "../$staging.zip" . echo "ASSET=$staging.zip" >> $GITHUB_ENV else cp "target/${{ matrix.target }}/release/${{ env.BIN_NAME }}" "$staging/" tar czf "$staging.tar.gz" -C "$staging" . echo "ASSET=$staging.tar.gz" >> $GITHUB_ENV fi - name: Upload release archive uses: actions/upload-release-asset@v1.0.1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ needs.create-release.outputs.upload_url }} asset_path: ${{ env.ASSET }} asset_name: ${{ env.ASSET }} asset_content_type: application/octet-stream