From 228dabecec7375d4adeb0232b8b38f8edd2a6f9d Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Fri, 25 Aug 2023 04:24:32 +0530 Subject: [PATCH] feat(ci): upgrade cargo-dist setup to 0.2.0-prerelease.5 --- .github/workflows/release.yml | 115 +++++++++++++++++++++++++++------- Cargo.toml | 17 +++-- 2 files changed, 100 insertions(+), 32 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8d665a9..55e1e5c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,3 +1,6 @@ +# Copyright 2022-2023, axodotdev +# SPDX-License-Identifier: MIT or Apache-2.0 +# # CI that: # # * checks for a Git Tag that looks like a release @@ -47,14 +50,15 @@ jobs: runs-on: ubuntu-latest outputs: has-releases: ${{ steps.create-release.outputs.has-releases }} + releases: ${{ steps.create-release.outputs.releases }} env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - uses: actions/checkout@v3 - - name: Install Rust - run: rustup update nightly-2023-02-22 --no-self-update && rustup default nightly-2023-02-22 + with: + submodules: recursive - name: Install cargo-dist - run: curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/cargo-dist/releases/download/v0.0.6/cargo-dist-installer.sh | sh + run: "curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/cargo-dist/releases/download/v0.2.0-prerelease.5/cargo-dist-installer.sh | sh" - id: create-release run: | cargo dist plan --tag=${{ github.ref_name }} --output-format=json > dist-manifest.json @@ -75,36 +79,37 @@ jobs: # Disable all the upload-artifacts tasks if we have no actual releases HAS_RELEASES=$(jq --raw-output ".releases != null" dist-manifest.json) echo "has-releases=$HAS_RELEASES" >> "$GITHUB_OUTPUT" + echo "releases=$(jq --compact-output ".releases" dist-manifest.json)" >> "$GITHUB_OUTPUT" - # Build and packages all the things - upload-artifacts: + # Build and packages all the platform-specific things + upload-local-artifacts: # Let the initial task tell us to not run (currently very blunt) needs: create-release if: ${{ needs.create-release.outputs.has-releases == 'true' }} strategy: + fail-fast: false matrix: # For these target platforms include: - - os: ubuntu-20.04 - dist-args: --artifacts=global - install-dist: curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/cargo-dist/releases/download/v0.0.6/cargo-dist-installer.sh | sh - - os: macos-11 - dist-args: --artifacts=local --target=aarch64-apple-darwin --target=x86_64-apple-darwin - install-dist: curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/cargo-dist/releases/download/v0.0.6/cargo-dist-installer.sh | sh - - os: ubuntu-20.04 - dist-args: --artifacts=local --target=x86_64-unknown-linux-gnu - install-dist: curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/cargo-dist/releases/download/v0.0.6/cargo-dist-installer.sh | sh - - os: windows-2019 - dist-args: --artifacts=local --target=x86_64-pc-windows-msvc - install-dist: irm https://github.com/axodotdev/cargo-dist/releases/download/v0.0.6/cargo-dist-installer.ps1 | iex - + - os: "macos-11" + dist-args: "--artifacts=local --target=aarch64-apple-darwin" + install-dist: "curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/cargo-dist/releases/download/v0.2.0-prerelease.5/cargo-dist-installer.sh | sh" + - os: "macos-11" + dist-args: "--artifacts=local --target=x86_64-apple-darwin" + install-dist: "curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/cargo-dist/releases/download/v0.2.0-prerelease.5/cargo-dist-installer.sh | sh" + - os: "windows-2019" + dist-args: "--artifacts=local --target=x86_64-pc-windows-msvc" + install-dist: "irm https://github.com/axodotdev/cargo-dist/releases/download/v0.2.0-prerelease.5/cargo-dist-installer.ps1 | iex" + - os: "ubuntu-20.04" + dist-args: "--artifacts=local --target=x86_64-unknown-linux-gnu" + install-dist: "curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/cargo-dist/releases/download/v0.2.0-prerelease.5/cargo-dist-installer.sh | sh" runs-on: ${{ matrix.os }} env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - uses: actions/checkout@v3 - - name: Install Rust - run: rustup update nightly-2023-02-22 --no-self-update && rustup default nightly-2023-02-22 + with: + submodules: recursive - name: Install cargo-dist run: ${{ matrix.install-dist }} - name: Run cargo-dist @@ -125,16 +130,82 @@ jobs: gh release upload ${{ github.ref_name }} $(cat uploads.txt) echo "uploaded!" + # Build and packages all the platform-agnostic(ish) things + upload-global-artifacts: + needs: upload-local-artifacts + runs-on: "ubuntu-20.04" + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + steps: + - uses: actions/checkout@v3 + with: + submodules: recursive + - name: Install cargo-dist + run: "curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/cargo-dist/releases/download/v0.2.0-prerelease.5/cargo-dist-installer.sh | sh" + # Get all the local artifacts for the global tasks to use (for e.g. checksums) + - name: Fetch local artifacts + run: | + gh release download ${{ github.ref_name }} --dir target/distrib/ + - name: Run cargo-dist + # This logic is a bit janky because it's trying to be a polyglot between + # powershell and bash since this will run on windows, macos, and linux! + # The two platforms don't agree on how to talk about env vars but they + # do agree on 'cat' and '$()' so we use that to marshal values between commands. + run: | + cargo dist build --tag=${{ github.ref_name }} --output-format=json "--artifacts=global" > dist-manifest.json + echo "dist ran successfully" + cat dist-manifest.json + + # Parse out what we just built and upload it to the Github Releaseā„¢ + jq --raw-output ".artifacts[]?.path | select( . != null )" dist-manifest.json > uploads.txt + echo "uploading..." + cat uploads.txt + gh release upload ${{ github.ref_name }} $(cat uploads.txt) + echo "uploaded!" + + upload-homebrew-formula: + needs: [create-release, upload-global-artifacts] + runs-on: "ubuntu-20.04" + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + RELEASES: ${{ needs.create-release.outputs.releases }} + GITHUB_USER: "axo bot" + GITHUB_EMAIL: "admin+bot@axo.dev" + steps: + - uses: actions/checkout@v3 + with: + repository: "msfjarvis/homebrew-tap" + token: ${{ secrets.HOMEBREW_TAP_TOKEN }} + # So we have access to the formula + - name: Fetch local artifacts + run: | + gh release download ${{ github.ref_name }} --dir Formula --repo ${GITHUB_REPOSITORY} --clobber + - name: Commit formula files + run: | + git config --global user.name "${GITHUB_USER}" + git config --global user.email "${GITHUB_EMAIL}" + + for release in $(echo "$RELEASES" | jq --compact-output '.[]'); do + name=$(echo "$release" | jq .app_name --raw-output) + version=$(echo "$release" | jq .app_version --raw-output) + + git add Formula/${name}.rb + git commit -m "${name} ${version}" + done + git push + # Mark the Github Releaseā„¢ as a non-draft now that everything has succeeded! publish-release: # Only run after all the other tasks, but it's ok if upload-artifacts was skipped - needs: [create-release, upload-artifacts] - if: ${{ always() && needs.create-release.result == 'success' && (needs.upload-artifacts.result == 'skipped' || needs.upload-artifacts.result == 'success') }} + needs: [create-release, upload-local-artifacts, upload-global-artifacts] + if: ${{ always() && needs.create-release.result == 'success' && (needs.upload-local-artifacts.result == 'skipped' || needs.upload-local-artifacts.result == 'success') && (needs.upload-global-artifacts.result == 'skipped' || needs.upload-global-artifacts.result == 'success') }} runs-on: ubuntu-latest env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - uses: actions/checkout@v3 + with: + submodules: recursive - name: mark release as non-draft run: | gh release edit ${{ github.ref_name }} --draft=false diff --git a/Cargo.toml b/Cargo.toml index 567688d..a14cd7d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -38,17 +38,14 @@ lto = "thin" # Config for 'cargo dist' [workspace.metadata.dist] # The preferred cargo-dist version to use in CI (Cargo.toml SemVer syntax) -cargo-dist-version = "0.0.6" -# The preferred Rust toolchain to use in CI (rustup toolchain syntax) -rust-toolchain-version = "nightly-2023-06-10" +cargo-dist-version = "0.2.0-prerelease.5" # CI backends to support (see 'cargo dist generate-ci') ci = ["github"] # The installers to generate for each app -installers = ["shell", "powershell"] +installers = ["shell", "powershell", "homebrew"] # Target platforms to build apps for (Rust target-triple syntax) -targets = [ - "x86_64-unknown-linux-gnu", - "x86_64-apple-darwin", - "x86_64-pc-windows-msvc", - "aarch64-apple-darwin", -] +targets = ["x86_64-unknown-linux-gnu", "x86_64-apple-darwin", "x86_64-pc-windows-msvc", "aarch64-apple-darwin"] +# A GitHub repo to push Homebrew formulas to +tap = "msfjarvis/homebrew-tap" +# Publish jobs to run in CI +publish-jobs = ["homebrew"]