From c42e3e30eab10a9023eb5b6d81b832b0a2ca4353 Mon Sep 17 00:00:00 2001 From: jdx <216188+jdx@users.noreply.github.com> Date: Mon, 18 Nov 2024 11:25:44 -0600 Subject: [PATCH] docs: use mise tasks for publishing (#3073) --- .github/workflows/autofix.yml | 2 +- .github/workflows/docs.yml | 11 +++-- .github/workflows/hyperfine.yml | 72 ++++++++++++++++++++++++++++++ .github/workflows/release-fig.yml | 2 +- .github/workflows/release-plz.yml | 2 +- .github/workflows/release.yml | 2 +- bun.lockb | Bin 0 -> 47374 bytes mise.toml | 1 + tasks.toml | 2 +- tasks/docs/release | 6 +++ tasks/test/coverage | 1 + 11 files changed, 90 insertions(+), 11 deletions(-) create mode 100644 .github/workflows/hyperfine.yml create mode 100755 bun.lockb diff --git a/.github/workflows/autofix.yml b/.github/workflows/autofix.yml index 959b7eead6..b9aa4fc487 100644 --- a/.github/workflows/autofix.yml +++ b/.github/workflows/autofix.yml @@ -34,7 +34,7 @@ jobs: cargo build --all-features echo "$PWD/target/debug" >> "$GITHUB_PATH" - run: mise install - - run: npm install + - run: mise x -- bun i - run: mise run render - run: mise run lint-fix - uses: autofix-ci/action@v1.3.1 diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index ae0fe6c289..cbb3e7b3f5 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -4,11 +4,13 @@ on: push: paths: - "docs/**" + - "tasks/docs/**" branches: - main pull_request: paths: - "docs/**" + - "tasks/docs/**" branches: - main @@ -16,9 +18,6 @@ concurrency: group: docs-${{ github.head_ref }} cancel-in-progress: true -env: - MISE_EXPERIMENTAL: 1 - jobs: docs: if: github.repository == 'jdx/mise' @@ -31,9 +30,9 @@ jobs: with: install_args: bun cache: false - - run: mise run docs:build - - if: github.event_name == 'push' && github.ref == 'refs/heads/main' - run: mise run docs:release + - run: bun i + - run: mise run docs:release env: AWS_ACCESS_KEY_ID: ${{ secrets.CLOUDFLARE_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.CLOUDFLARE_SECRET_ACCESS_KEY }} + DRY_RUN: ${{ github.event_name != 'push' || github.ref != 'refs/heads/main' }} diff --git a/.github/workflows/hyperfine.yml b/.github/workflows/hyperfine.yml new file mode 100644 index 0000000000..563aa6349f --- /dev/null +++ b/.github/workflows/hyperfine.yml @@ -0,0 +1,72 @@ +name: hyperfine +on: + push: + branches: ["main"] + pull_request: + branches: ["main"] + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +env: + CARGO_TERM_COLOR: always + GITHUB_TOKEN: ${{ secrets.RTX_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + MISE_EXPERIMENTAL: 1 + +permissions: + pull-requests: write + +jobs: + benchmark: + runs-on: ubuntu-latest + timeout-minutes: 20 + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - uses: Swatinem/rust-cache@v2 + - run: curl https://mise.run | MISE_INSTALL_PATH="$HOME/bin/mise-release" sh + - run: echo "$HOME/bin" >> "$GITHUB_PATH" + - id: versions + run: | + echo "main=$(git rev-parse --short origin/main)" >> $GITHUB_OUTPUT + echo "release=$(mise-release v | awk '{print $1}')" >> $GITHUB_OUTPUT + - uses: actions/cache@v4 + with: + path: $HOME/bin/mise-${{ steps.versions.outputs.main }} + key: mise-hyperfine-main-${{ steps.versions.outputs.main }}-${{ runner.os }} + - name: build main + run: | + if [ ! -f "$HOME/bin/mise-${{ steps.versions.outputs.main }}" ]; then + git checkout main + cargo build --profile serious && mv target/serious/mise $HOME/bin/mise-${{ steps.versions.outputs.main }} + git checkout - + fi + - run: mv $HOME/bin/mise-release $HOME/bin/mise-${{ steps.versions.outputs.release }} + - run: cp $HOME/bin/mise-${{ steps.versions.outputs.main }} $HOME/bin/mise-main + - run: cargo build --profile serious && mv target/serious/mise $HOME/bin + - run: mise i + - run: | + CMDS=( + "x -- echo" + "env" + "hook-env" + "ls" + ) + echo "# Hyperfine Performance" >> comment.md + for cmd in "${CMDS[@]}"; do + mise x hyperfine -- hyperfine -N -w 10 -r 500 --export-markdown out.md --reference "mise-main $cmd" "mise-${{ steps.versions.outputs.release }} $cmd" "mise $cmd" + echo "### \`mise $cmd\`" >> comment.md + cat out.md >> comment.md + done + cat comment.md >> $GITHUB_STEP_SUMMARY + env: + SHELL: zsh + - name: Comment on PR + uses: thollander/actions-comment-pull-request@v3 + #if: "startsWith(github.event.pull_request.title, 'perf:') || startsWith(github.event.pull_request.title, 'chore: release')" + with: + file-path: comment.md + comment-tag: hyperfine diff --git a/.github/workflows/release-fig.yml b/.github/workflows/release-fig.yml index 601b162de5..8f9e2dbce4 100644 --- a/.github/workflows/release-fig.yml +++ b/.github/workflows/release-fig.yml @@ -19,9 +19,9 @@ jobs: shared-key: test-ubuntu-latest save-if: false - run: mkdir -p "$HOME/bin" && echo "$HOME/bin" >> "$GITHUB_PATH" - - run: npm i - run: cargo build --all-features && cp target/debug/mise "$HOME"/bin - run: mise install + - run: mise x -- bun i - run: mise run render:fig - name: Create Autocomplete PR ## Create the autocomplete PR using this action uses: withfig/push-to-fig-autocomplete-action@v2 diff --git a/.github/workflows/release-plz.yml b/.github/workflows/release-plz.yml index 76eee3d938..0d76360680 100644 --- a/.github/workflows/release-plz.yml +++ b/.github/workflows/release-plz.yml @@ -42,9 +42,9 @@ jobs: shared-key: test-ubuntu-latest save-if: false - run: mkdir -p "$HOME/bin" && echo "$HOME/bin" >> "$GITHUB_PATH" - - run: npm i - run: cargo build --all-features && cp target/debug/mise "$HOME"/bin - run: mise install + - run: mise x -- bun i - run: mise run release-plz env: CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 59b720d008..10df605b36 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -3,7 +3,7 @@ name: release on: push: tags: ["v*"] - branches: ["release", "windows", "docs"] + branches: ["release"] workflow_dispatch: concurrency: diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..79e88eb34ec6f3e7a3b3a64ebae06d32d0b8f446 GIT binary patch literal 47374 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