Compare commits

...

14 Commits

Author SHA1 Message Date
Taiki Endo
0c935a690f Update uv manifest 2026-05-05 21:39:54 +00:00
Taiki Endo
53f4d007fe Update mise manifest 2026-05-05 21:39:54 +00:00
Taiki Endo
4c05641ce4 Update prek manifest 2026-05-05 18:51:54 +00:00
Taiki Endo
8278f6dee2 Add fallback input option to input option list in readme 2026-05-06 02:11:13 +09:00
Taiki Endo
a1c338d97e Add documentation about release process 2026-05-06 01:48:05 +09:00
Taiki Endo
02cc445cca Update changelog/comment 2026-05-06 00:15:52 +09:00
Taiki Endo
cca35edeb1 Release 2.77.1 2026-05-05 15:10:04 +00:00
Taiki Endo
e60138699e ci: Fix release workflow 2026-05-06 00:06:18 +09:00
Taiki Endo
651945350f Update tombi@latest to 0.10.3 2026-05-05 14:05:31 +00:00
Taiki Endo
bfbdc59475 Update prek manifest 2026-05-05 14:05:31 +00:00
Taiki Endo
9f306516af Update martin@latest to 1.8.2 2026-05-05 14:05:31 +00:00
Taiki Endo
d1eee517af codegen: Ignore uv 0.11.9
```
verifying https://github.com/astral-sh/uv/releases/download/0.11.9/uv-x86_64-unknown-linux-musl.tar.gz with gh attestation verify

Error: HTTP 404: Not Found (https://api.github.com/repos/astral-sh/uv/attestations/sha256:ac3e5051edbf30613b0f90d1c18d4807fea6b246f37490799fee0c1284a658b2?per_page=30&predicate_type=https://slsa.dev/provenance/v1)
```

https://github.com/astral-sh/uv/issues/19278
2026-05-05 22:47:55 +09:00
Taiki Endo
a4ad60dd6a ci: Use taiki-e/github-actions/.github/workflows/action-release.yml 2026-05-05 22:36:13 +09:00
Taiki Endo
39b209ec4a ci: Update config 2026-05-05 10:56:05 +09:00
19 changed files with 344 additions and 423 deletions

View File

@@ -34,7 +34,6 @@ rdme
rootfs rootfs
sccache sccache
SHASUMS SHASUMS
shortstat
sigstore sigstore
startswith startswith
syft syft
@@ -43,7 +42,6 @@ udeps
USERPROFILE USERPROFILE
wasmtime wasmtime
watchexec watchexec
worktree
xbuild xbuild
xscale xscale
xwin xwin

View File

@@ -32,20 +32,20 @@ concurrency:
jobs: jobs:
miri: miri:
uses: taiki-e/github-actions/.github/workflows/miri.yml@75415970465917c31d702710acd9c9248b9af314 # main uses: taiki-e/github-actions/.github/workflows/miri.yml@2474ed4664eb8903c151603a9d841512c069f7f6 # main
with: with:
# NB: sync with test job's --exclude option # NB: sync with test job's --exclude option
args: --exclude install-action-internal-codegen args: --exclude install-action-internal-codegen
msrv: msrv:
uses: taiki-e/github-actions/.github/workflows/msrv.yml@75415970465917c31d702710acd9c9248b9af314 # main uses: taiki-e/github-actions/.github/workflows/msrv.yml@2474ed4664eb8903c151603a9d841512c069f7f6 # main
test-manifest-schema: test-manifest-schema:
uses: taiki-e/github-actions/.github/workflows/test.yml@75415970465917c31d702710acd9c9248b9af314 # main uses: taiki-e/github-actions/.github/workflows/test.yml@2474ed4664eb8903c151603a9d841512c069f7f6 # main
with: with:
# NB: sync with miri job's --exclude option # NB: sync with miri job's --exclude option
test-args: --exclude install-action-internal-codegen test-args: --exclude install-action-internal-codegen
no-std: false no-std: false
tidy: tidy:
uses: taiki-e/github-actions/.github/workflows/tidy.yml@75415970465917c31d702710acd9c9248b9af314 # main uses: taiki-e/github-actions/.github/workflows/tidy.yml@2474ed4664eb8903c151603a9d841512c069f7f6 # main
permissions: permissions:
contents: write # for creating branch for pr contents: write # for creating branch for pr
pull-requests: write # unused (used in `codegen-automerge: true` case) pull-requests: write # unused (used in `codegen-automerge: true` case)
@@ -117,8 +117,6 @@ jobs:
- uses: ./ - uses: ./
with: with:
tool: ${{ steps.tool-list.outputs.tool }} tool: ${{ steps.tool-list.outputs.tool }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# Test all shells listed in https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsshell # Test all shells listed in https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsshell
- name: Test bash - name: Test bash
run: just --version && shfmt --version && protoc --version && rustc --version && cargo --version && rustup --version run: just --version && shfmt --version && protoc --version && rustc --version && cargo --version && rustup --version
@@ -159,7 +157,7 @@ jobs:
- run: env - run: env
- uses: ./ - uses: ./
with: with:
# NB: Update alias list in release.yml, case for aliases in main.sh, # NB: Update alias list in tools/ci/release-post-commit.sh, case for aliases in main.sh,
# and match for alias for tools/codegen/src/tools-markdown.rs. # and match for alias for tools/codegen/src/tools-markdown.rs.
tool: | tool: |
nextest nextest
@@ -167,8 +165,6 @@ jobs:
typos-cli typos-cli
wasm-bindgen-cli wasm-bindgen-cli
wasmtime-cli wasmtime-cli
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Test bash - name: Test bash
run: cargo-nextest nextest --version && taplo --version run: cargo-nextest nextest --version && taplo --version
shell: bash shell: bash
@@ -319,8 +315,6 @@ jobs:
- uses: ./ - uses: ./
with: with:
tool: ${{ steps.tool-list.outputs.tool }} tool: ${{ steps.tool-list.outputs.tool }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Test bash - name: Test bash
run: just --version && shfmt --version run: just --version && shfmt --version
shell: bash shell: bash

View File

@@ -32,7 +32,7 @@ concurrency:
jobs: jobs:
manifest: manifest:
uses: taiki-e/github-actions/.github/workflows/gen.yml@a6df8c9ea0038c730f138f0f849d692cf387ea4e # main uses: taiki-e/github-actions/.github/workflows/gen.yml@2474ed4664eb8903c151603a9d841512c069f7f6 # main
permissions: permissions:
contents: write # for creating branch for pr contents: write # for creating branch for pr
pull-requests: write # for gh pr review --approve pull-requests: write # for gh pr review --approve

View File

@@ -1,7 +1,5 @@
name: Release name: Release
# Adapted from https://github.com/taiki-e/github-actions/blob/HEAD/.github/workflows/action-release.yml.
permissions: {} permissions: {}
on: on:
@@ -32,408 +30,21 @@ concurrency:
cancel-in-progress: false cancel-in-progress: false
jobs: jobs:
prepare:
if: github.repository_owner == 'taiki-e' && inputs.target == 'install-action'
runs-on: ubuntu-24.04
timeout-minutes: 60
steps:
- uses: taiki-e/checkout-action@7d1e50e93dc4fb3bba58f85018fadf77898aee8b # v1.4.2
- uses: taiki-e/install-action@58e862542551f667fa44c8a2a4a1d64ad477c96a # v2.75.17
with:
tool: parse-changelog
fallback: none
- id: check
run: |
IFS=$'\n\t'
trap -- 's=$?; printf >&2 "%s\n" "${0##*/}:${LINENO}: \`${BASH_COMMAND}\` exit with ${s}"; exit ${s}' ERR
retry() {
for i in {1..10}; do
if "$@"; then
return 0
else
sleep "${i}"
fi
done
"$@"
}
bail() {
printf '::error::%s\n' "$*"
exit 1
}
if { sed --help 2>&1 || true; } | grep -Eq -e '-i extension'; then
in_place=(-i '')
else
in_place=(-i)
fi
# shellcheck disable=SC2153
version="${VERSION}"
printf 'version(input): %s\n' "${version}"
# shellcheck disable=SC2153
tag_prefix="${TAG_PREFIX}"
printf 'tag_prefix: %s\n' "${tag_prefix}"
# shellcheck disable=SC2153
changelog="${CHANGELOG}"
printf 'changelog: %s\n' "${changelog}"
# Get the current date.
release_date=$(date -u '+%Y-%m-%d')
printf 'release-date: %s\n' "${release_date}"
printf 'release-date=%s\n' "${release_date}" >>"${GITHUB_OUTPUT}"
# Get the current revision.
rev=$(git rev-parse HEAD)
printf 'rev: %s\n' "${rev}"
printf 'rev=%s\n' "${rev}" >>"${GITHUB_OUTPUT}"
prev_version=$(parse-changelog --title-no-link "${changelog}" | cut -d' ' -f1)
# Determine the new version number and tag name.
case "${version}" in
major | minor | patch)
if [[ ! "${prev_version}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
bail "pre-release/build-metadata"
fi
major="${prev_version%%.*}"
minor_patch="${prev_version#*.}"
minor="${minor_patch%%.*}"
patch="${minor_patch#*.}"
case "${version}" in
major) version="$((major+1)).0.0" ;;
minor) version="${major}.$((minor+1)).0" ;;
patch) version="${major}.${minor}.$((patch+1))" ;;
esac
;;
*) version="${version#v}" ;;
esac
if [[ ! "${version}" =~ ^[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z\.-]+)?(\+[0-9A-Za-z\.-]+)?$ ]]; then
bail "invalid version format '${version}'"
fi
printf 'version: %s\n' "${version}"
printf 'version=%s\n' "${version}" >>"${GITHUB_OUTPUT}"
tag="${tag_prefix}${version}"
printf 'tag: %s\n' "${tag}"
printf 'tag=%s\n' "${tag}" >>"${GITHUB_OUTPUT}"
# Make sure the same release has not been created in the past.
if gh release view "${tag}" &>/dev/null; then
bail "tag '${tag}' has already been created and pushed"
fi
# Make sure that the release was created from an allowed branch.
if ! git branch | grep -Eq '\* '"${BRANCH}"'$'; then
bail "current branch is not '${BRANCH}'"
fi
changed_paths=()
retry git fetch origin --tags &>/dev/null
tags=$(git --no-pager tag | { grep -E "^${tag_prefix}[0-9]+" || true; })
if [[ -n "${tags}" ]]; then
printf 'has-tags=true\n' >>"${GITHUB_OUTPUT}"
# Make sure the same release does not exist in changelog.
if grep -Eq "^## \\[${version//./\\.}\\]" "${changelog}"; then
bail "release ${version} already exist in ${changelog}"
fi
if grep -Eq "^\\[${version//./\\.}\\]: " "${changelog}"; then
bail "link to ${version} already exist in ${changelog}"
fi
# Update changelog.
changed_paths+=("${changelog}")
remote_url=$(grep -E '^\[Unreleased\]: https://' "${changelog}" | sed -E 's/^\[Unreleased\]: //; s/\.\.\.HEAD$//')
prev_tag="${remote_url#*/compare/}"
remote_url="${remote_url%/compare/*}"
sed -E "${in_place[@]}" \
-e "s/^## \\[Unreleased\\]/## [Unreleased]\\n\\n## [${version}] - ${release_date}/" \
-e "s#^\[Unreleased\]: https://.*#[Unreleased]: ${remote_url}/compare/${tag}...HEAD\\n[${version}]: ${remote_url}/compare/${prev_tag}...${tag}#" "${changelog}"
if ! grep -Eq "^## \\[${version//./\\.}\\] - ${release_date}$" "${changelog}"; then
bail "failed to update ${changelog}"
fi
if ! grep -Eq "^\\[${version//./\\.}\\]: " "${changelog}"; then
bail "failed to update ${changelog}"
fi
else
# Make sure the release exists in changelog.
if ! grep -Eq "^## \\[${version//./\\.}\\] - ${release_date}$" "${changelog}"; then
bail "release ${version} does not exist in ${changelog} or has wrong release date"
fi
if ! grep -Eq "^\\[${version//./\\.}\\]: " "${changelog}"; then
bail "link to ${version} does not exist in ${changelog}"
fi
fi
# Make sure that a valid release note for this version exists.
# https://github.com/taiki-e/parse-changelog
changes=$(parse-changelog "${changelog}" "${version}")
if [[ -z "${changes}" ]]; then
bail "changelog for ${version} has no body"
fi
printf '============== CHANGELOG ==============\n'
printf '%s\n' "${changes}"
printf '=======================================\n'
if [[ -n "${tags}" ]]; then
git -c color.ui=always diff "${changed_paths[@]}"
git add "${changed_paths[@]}"
fi
# Make sure that there is no unintended change.
git add -N .
git -c color.ui=always diff --exit-code
(
set -x
git show HEAD --shortstat
)
env:
VERSION: ${{ inputs.version }}
TAG_PREFIX: v
CHANGELOG: CHANGELOG.md
BRANCH: main
outputs:
has-tags: ${{ steps.check.outputs.has-tags }}
release-date: ${{ steps.check.outputs.release-date }}
rev: ${{ steps.check.outputs.rev }}
tag: ${{ steps.check.outputs.tag }}
version: ${{ steps.check.outputs.version }}
release: release:
if: github.repository_owner == 'taiki-e' && inputs.target == 'install-action' if: github.repository_owner == 'taiki-e' && inputs.target == 'install-action'
needs: prepare uses: taiki-e/github-actions/.github/workflows/action-release.yml@2474ed4664eb8903c151603a9d841512c069f7f6 # main
runs-on: ubuntu-24.04
timeout-minutes: 60
environment:
name: release
deployment: false
permissions: permissions:
contents: write # for taiki-e/create-gh-release-action contents: write # for taiki-e/create-gh-release-action
steps: secrets:
- uses: taiki-e/checkout-action@7d1e50e93dc4fb3bba58f85018fadf77898aee8b # v1.4.2 PUSH_TOKEN_APP_CLIENT_ID: ${{ secrets.PUSH_TOKEN_APP_CLIENT_ID }}
- uses: taiki-e/install-action@58e862542551f667fa44c8a2a4a1d64ad477c96a # v2.75.17 PUSH_TOKEN_APP_PRIVATE_KEY: ${{ secrets.PUSH_TOKEN_APP_PRIVATE_KEY }}
with: with:
tool: parse-changelog version: ${{ inputs.version }}
fallback: none post-commit-script: tools/ci/release-post-commit.sh
- uses: actions/create-github-app-token@1b10c78c7865c340bc4f6099eb2f838309f1e8c3 # v3.1.1
id: push-token
with:
client-id: ${{ secrets.PUSH_TOKEN_APP_CLIENT_ID }}
private-key: ${{ secrets.PUSH_TOKEN_APP_PRIVATE_KEY }}
- name: Create and push release commit and tag
id: push
run: |
IFS=$'\n\t'
trap -- 's=$?; printf >&2 "%s\n" "${0##*/}:${LINENO}: \`${BASH_COMMAND}\` exit with ${s}"; exit ${s}' ERR
retry() {
for i in {1..10}; do
if "$@"; then
return 0
else
sleep "${i}"
fi
done
"$@"
}
bail() {
printf '::error::%s\n' "$*"
exit 1
}
if { sed --help 2>&1 || true; } | grep -Eq -e '-i extension'; then
in_place=(-i '')
else
in_place=(-i)
fi
git config user.name 'Taiki Endo'
git config user.email 'te316e89@gmail.com'
# shellcheck disable=SC2153
version="${VERSION}"
# shellcheck disable=SC2153
tag="${TAG}"
# shellcheck disable=SC2153
changelog="${CHANGELOG}"
# shellcheck disable=SC2153
release_date="${RELEASE_DATE}"
# Make sure the current revision is same as prepare step.
# --unshallow is necessary to successfully push the
# "releases/${major_version_tag}" branch in the subsequent step.
retry git fetch origin --unshallow &>/dev/null
rev=$(git rev-parse HEAD)
if [[ "${rev}" != "${PREPARE_REV}" ]]; then
bail "revision difference between prepare step"
fi
# Make sure the same release has not been created in the past.
if gh release view "${tag}" &>/dev/null; then
bail "tag '${tag}' has already been created and pushed"
fi
# Make sure that the release was created from an allowed branch.
if ! git branch | grep -Eq '\* '"${BRANCH}"'$'; then
bail "current branch is not '${BRANCH}'"
fi
changed_paths=()
if [[ "${HAS_TAGS}" == "true" ]]; then
# Update changelog.
changed_paths+=("${changelog}")
remote_url=$(grep -E '^\[Unreleased\]: https://' "${changelog}" | sed -E 's/^\[Unreleased\]: //; s/\.\.\.HEAD$//')
prev_tag="${remote_url#*/compare/}"
remote_url="${remote_url%/compare/*}"
sed -E "${in_place[@]}" \
-e "s/^## \\[Unreleased\\]/## [Unreleased]\\n\\n## [${version}] - ${release_date}/" \
-e "s#^\[Unreleased\]: https://.*#[Unreleased]: ${remote_url}/compare/${tag}...HEAD\\n[${version}]: ${remote_url}/compare/${prev_tag}...${tag}#" "${changelog}"
if ! grep -Eq "^## \\[${version//./\\.}\\] - ${release_date}$" "${changelog}"; then
bail "failed to update ${changelog}"
fi
if ! grep -Eq "^\\[${version//./\\.}\\]: " "${changelog}"; then
bail "failed to update ${changelog}"
fi
fi
changes=$(parse-changelog "${changelog}" "${version}")
printf '============== CHANGELOG ==============\n'
printf '%s\n' "${changes}"
printf '=======================================\n'
if [[ "${HAS_TAGS}" == "true" ]]; then
# Create a release commit.
(
set -x
git add "${changed_paths[@]}"
git commit -m "Release ${version}"
)
fi
major_version_tag="v${version%%.*}"
(
set -x
git tag "${tag}"
git branch "releases/${major_version_tag}"
git tag -f "${major_version_tag}"
)
refs=("refs/heads/${BRANCH}" "refs/tags/${tag}" "refs/heads/releases/${major_version_tag}" "+refs/tags/${major_version_tag}")
tools=()
for tool in tools/codegen/base/*.json; do
tool="${tool##*/}"
tools+=("${tool%.*}")
done
# Aliases.
# NB: Update case for aliases in main.sh, tool input option in test-alias job
# in .github/workflows/ci.yml, and match for alias for tools/codegen/src/tools-markdown.rs.
tools+=(
nextest
taplo-cli
typos-cli
wasm-bindgen-cli
wasmtime-cli
)
# Non-manifest-based tools.
tools+=(valgrind)
branches=()
for tool in "${tools[@]}"; do
(
set -x
git checkout -b "releases/${tool}"
sed -E "${in_place[@]}" action.yml \
-e "s/required: true/required: false/g" \
-e "s/# default: #publish:tool/default: ${tool}/g"
git add action.yml
git commit -m "${tool}"
git tag -f "${tool}"
git checkout refs/tags/"${tag}"
)
refs+=("+refs/heads/releases/${tool}" "+refs/tags/${tool}")
branches+=("releases/${tool}")
done
prev_credential_helper=$(git config get --local credential.helper || true)
if [[ -n "${prev_credential_helper}" ]]; then
printf 'credential helper is already set (%s)\n' "${prev_credential_helper}"
else
protocol="${GITHUB_SERVER_URL%%://*}"
hostname="${GITHUB_SERVER_URL#*://}"
(
set -x
git config --local credential.helper cache
)
git credential approve <<EOF
protocol=${protocol}
host=${hostname}
username=${GITHUB_ACTOR}
password=${PUSH_TOKEN}
EOF
# Remove credential helper config on exit.
trap -- '(set -x; git credential-cache exit; git config --local --unset credential.helper || true)' EXIT
fi
(
set -x
retry git push origin --atomic "${refs[@]}"
git branch -d "releases/${major_version_tag}"
git branch -D "${branches[@]}"
schema_workspace=/tmp/workspace
rm -rf -- "${schema_workspace}"
# Checkout manifest-schema branch
schema_version="$(cargo metadata --format-version=1 --no-deps | jq -r '.packages[] | select(.name == "install-action-manifest-schema") | .version')"
if [[ "${schema_version}" == "0."* ]]; then
schema_version="0.$(cut -d. -f2 <<<"${schema_version}")"
else
schema_version="$(cut -d. -f1 <<<"${schema_version}")"
fi
schema_branch="manifest-schema-${schema_version}"
git worktree add --force "${schema_workspace}"
(
cd -- "${schema_workspace}"
if git fetch origin "${schema_branch}"; then
git checkout "origin/${schema_branch}" -B "${schema_branch}"
elif ! git checkout "${schema_branch}"; then
# New branch with no history. Credit: https://stackoverflow.com/a/13969482
git checkout --orphan "${schema_branch}"
git rm -rf -- . || true
git commit -m 'Initial commit' --allow-empty
fi
)
# Copy over schema
cp -- ./manifests/* "${schema_workspace}"
(
cd -- "${schema_workspace}"
# Stage changes
git add .
# Detect changes, then commit and push if changes exist
if [[ "$(git status --porcelain=v1 | LC_ALL=C wc -l)" != "0" ]]; then
git commit -m 'Update manifest schema'
retry git push origin HEAD
fi
)
rm -rf -- "${schema_workspace}"
git worktree prune
# TODO: get branch in schema_workspace dir instead
git branch -D "${schema_branch}" "${schema_workspace##*/}"
)
env:
VERSION: ${{ needs.prepare.outputs.version }}
RELEASE_DATE: ${{ needs.prepare.outputs.release-date }}
HAS_TAGS: ${{ needs.prepare.outputs.has-tags }}
TAG: ${{ needs.prepare.outputs.tag }}
CHANGELOG: CHANGELOG.md
BRANCH: main
PREPARE_REV: ${{ needs.prepare.outputs.rev }}
# Note that if we use secrets.GITHUB_TOKEN, the pushed commit/tag cannot trigger other workflows.
PUSH_TOKEN: ${{ steps.push-token.outputs.token }}
- uses: taiki-e/create-gh-release-action@eba8ea96c86cca8a37f1b56e94b4d13301fba651 # v1.11.0
with:
changelog: CHANGELOG.md
title: $version
branch: main
ref: refs/tags/${{ needs.prepare.outputs.tag }}
release-manifest-schema: release-manifest-schema:
if: github.repository_owner == 'taiki-e' && inputs.target == 'install-action-manifest-schema' if: github.repository_owner == 'taiki-e' && inputs.target == 'install-action-manifest-schema'
uses: taiki-e/github-actions/.github/workflows/rust-release.yml@75415970465917c31d702710acd9c9248b9af314 # main uses: taiki-e/github-actions/.github/workflows/rust-release.yml@2474ed4664eb8903c151603a9d841512c069f7f6 # main
permissions: permissions:
contents: write # for taiki-e/create-gh-release-action contents: write # for taiki-e/create-gh-release-action
id-token: write # for rust-lang/crates-io-auth-action id-token: write # for rust-lang/crates-io-auth-action
@@ -444,7 +55,7 @@ jobs:
with: with:
version: ${{ inputs.version }} version: ${{ inputs.version }}
tag-prefix: install-action-manifest-schema- tag-prefix: install-action-manifest-schema-
crates: tools/manifest-schema package: install-action-manifest-schema
changelog: tools/manifest-schema/CHANGELOG.md changelog: tools/manifest-schema/CHANGELOG.md
title: $prefix $version title: $prefix $version
prefix: install-action-manifest-schema prefix: install-action-manifest-schema

View File

@@ -10,6 +10,14 @@ Note: In this file, do not use the hard wrap in the middle of a sentence for com
## [Unreleased] ## [Unreleased]
## [2.77.1] - 2026-05-05
- Support `taiki-e/install-action@rust` tag.
- Update `tombi@latest` to 0.10.3.
- Update `martin@latest` to 1.8.2.
## [2.77.0] - 2026-05-05 ## [2.77.0] - 2026-05-05
- Support `rust`. ([#1779](https://github.com/taiki-e/install-action/pull/1779)) - Support `rust`. ([#1779](https://github.com/taiki-e/install-action/pull/1779))
@@ -6460,7 +6468,8 @@ Note: This release is considered a breaking change because installing on version
Initial release Initial release
[Unreleased]: https://github.com/taiki-e/install-action/compare/v2.77.0...HEAD [Unreleased]: https://github.com/taiki-e/install-action/compare/v2.77.1...HEAD
[2.77.1]: https://github.com/taiki-e/install-action/compare/v2.77.0...v2.77.1
[2.77.0]: https://github.com/taiki-e/install-action/compare/v2.76.0...v2.77.0 [2.77.0]: https://github.com/taiki-e/install-action/compare/v2.76.0...v2.77.0
[2.76.0]: https://github.com/taiki-e/install-action/compare/v2.75.30...v2.76.0 [2.76.0]: https://github.com/taiki-e/install-action/compare/v2.75.30...v2.76.0
[2.75.30]: https://github.com/taiki-e/install-action/compare/v2.75.29...v2.75.30 [2.75.30]: https://github.com/taiki-e/install-action/compare/v2.75.29...v2.75.30

View File

@@ -36,3 +36,29 @@ to the platform object.
If CI fails only for containers using older versions of glibc or musl, you may need to add the tool If CI fails only for containers using older versions of glibc or musl, you may need to add the tool
name to one of the `*_incompat` arrays in `tools/ci/tool-list.sh`. name to one of the `*_incompat` arrays in `tools/ci/tool-list.sh`.
## Release new version
Releases are performed by running the [release workflow](https://github.com/taiki-e/install-action/actions/workflows/release.yml) via workflow dispatch. The owner and collaborators can start the release workflow, but the owners [approval](https://docs.github.com/en/actions/reference/workflows-and-actions/deployments-and-environments#required-reviewers) is required before the actual release.
### Minor version vs patch version
Increase the patch version if only the following changes are included.
- Update the `@latest` version of the tool.
Rationale: Normally, tool versions are controlled by the `@<version>` syntax, which is explicitly separated from the versioning of the install-action itself.
Exception: If the major or minor version of the `cargo-binstall` is updated, the minor version may be increased because the behavior of the fallback may change slightly.
- Fix regressions or minor bugs.
Rationale: Semantic Versioning.
- Improve documentation or diagnostics.
Rationale: Semantic Versioning.
Usually increase the minor version otherwise.
Adding support for a new tool may conflict with existing fallbacks, so it is necessary to increase the minor version.

View File

@@ -24,6 +24,7 @@ GitHub Action for installing development tools (mainly from GitHub Releases).
| ---- | :------: | ----------- | ---- | ------- | | ---- | :------: | ----------- | ---- | ------- |
| tool | **✓** | Tools to install (whitespace or comma separated list) | String | | | tool | **✓** | Tools to install (whitespace or comma separated list) | String | |
| checksum | | Whether to enable checksums (strongly discouraged to disable) | Boolean | `true` | | checksum | | Whether to enable checksums (strongly discouraged to disable) | Boolean | `true` |
| fallback | | Whether to use fallback (none, cargo-binstall, or cargo-install) | String | `cargo-binstall` |
### Example workflow ### Example workflow

View File

@@ -11,7 +11,7 @@ inputs:
required: false required: false
default: 'true' default: 'true'
fallback: fallback:
description: Whether to use fallback (none, cargo-binstall, cargo-install) description: Whether to use fallback (none, cargo-binstall, or cargo-install)
required: false required: false
default: 'cargo-binstall' default: 'cargo-binstall'

View File

@@ -774,6 +774,7 @@ for tool in "${tools[@]}"; do
esac esac
fi fi
installed_bin=() installed_bin=()
# NB: Update tools/ci/release-post-commit.sh when adding non-manifest-based tools.
case "${tool}" in case "${tool}" in
rust) rust)
if [[ "${version}" == 'latest' ]]; then if [[ "${version}" == 'latest' ]]; then
@@ -957,7 +958,7 @@ for tool in "${tools[@]}"; do
;; ;;
*) *)
# Handle aliases. # Handle aliases.
# NB: Update alias list in .github/workflows/release.yml, tool input option in test-alias in .github/workflows/ci.yml, # NB: Update alias list in tools/ci/release-post-commit.sh, tool input option in test-alias in .github/workflows/ci.yml,
# and match for alias for tools/codegen/src/tools-markdown.rs. # and match for alias for tools/codegen/src/tools-markdown.rs.
# TODO(codegen): auto-detect cases where crate name and tool name are different. # TODO(codegen): auto-detect cases where crate name and tool name are different.
case "${tool}" in case "${tool}" in

24
manifests/martin.json generated
View File

@@ -31,13 +31,31 @@
} }
}, },
"latest": { "latest": {
"version": "1.8.0" "version": "1.8.2"
}, },
"1": { "1": {
"version": "1.8.0" "version": "1.8.2"
}, },
"1.8": { "1.8": {
"version": "1.8.0" "version": "1.8.2"
},
"1.8.2": {
"x86_64_linux_musl": {
"etag": "0x8DEAA75F9C0717B",
"hash": "b7ce4906219974f33c0c80994fde6afe503cd8fc6e4c37fd75caf77f320d98cc"
},
"x86_64_macos": {
"etag": "0x8DEAA75F8954F43",
"hash": "6be5743e73b43bc7ef34d17b94e7fdce5f3eafa26120a67ce317b55d557ba481"
},
"aarch64_linux_musl": {
"etag": "0x8DEAA75F885D044",
"hash": "d994a862ae5ded571da994f3e525c04e4afb8ee355e3c91135fb0ff78f8d1294"
},
"aarch64_macos": {
"etag": "0x8DEAA75F8A93635",
"hash": "11a05523e1e59c8322bae7bb49442eaa22bb355905222f96e723b9ca42dd4316"
}
}, },
"1.8.0": { "1.8.0": {
"x86_64_linux_musl": { "x86_64_linux_musl": {

26
manifests/mise.json generated
View File

@@ -35,6 +35,32 @@
"2026.5": { "2026.5": {
"version": "2026.5.0" "version": "2026.5.0"
}, },
"2026.5.1": {
"x86_64_linux_musl": {
"etag": "0x8DEAAEAFD6A3D30",
"hash": "5cb9f8cc7b071c5c5931fafd79bd523a81cbffe6bb23d56daea7b0be86d0a086"
},
"x86_64_macos": {
"etag": "0x8DEAAEAFFDCC12D",
"hash": "ed6c715d359bf2313fe793bc44269e38df24246c91a453fffbd0b9d94642af8f"
},
"x86_64_windows": {
"etag": "0x8DEAAEB01618438",
"hash": "a82d52bdf35e29e93c264f5dff2bebcc50030101f98dc0902ea039a043b003a5"
},
"aarch64_linux_musl": {
"etag": "0x8DEAAEAF98AF700",
"hash": "375c6a365bf7a42b3645fd3816fbd11c94c1d04af9df49910fbe11929878a365"
},
"aarch64_macos": {
"etag": "0x8DEAAEAFF27F87B",
"hash": "0eeb03e5f64f2c8fa2b0bcdb3a57fae11057d84d1f24381eb34b90663c68ffa3"
},
"aarch64_windows": {
"etag": "0x8DEAAEB00E9591F",
"hash": "d5b6c29be4711ede84b2f08b54b626e6c36ba7b1610b8193d81dcf3a3c0728a4"
}
},
"2026.5.0": { "2026.5.0": {
"x86_64_linux_musl": { "x86_64_linux_musl": {
"etag": "0x8DEA9471A2EEE95", "etag": "0x8DEA9471A2EEE95",

68
manifests/prek.json generated
View File

@@ -44,6 +44,74 @@
"0.3": { "0.3": {
"version": "0.3.11" "version": "0.3.11"
}, },
"0.3.13": {
"x86_64_linux_musl": {
"etag": "0x8DEAAD16585793A",
"hash": "e10cb36c9181044cda34522899457458e3551396dbc4dcf60e1ac1a8d7a71670"
},
"x86_64_macos": {
"etag": "0x8DEAAD164CE6904",
"hash": "2bbfdf15cfe6e954b98cb27094828f5c55a8bec0a02cf55041f783c71e3b8955"
},
"x86_64_windows": {
"etag": "0x8DEAAD165069ED8",
"hash": "ca32a6451cfdd22a27d99313b3a2f91eb0ce6d191eb8e35e2467f1551252ebbb"
},
"aarch64_linux_musl": {
"etag": "0x8DEAAD16312F4C4",
"hash": "af3122f5ddd69644b7cf4d3e3263305e7e2d12e03be2cb56e8888493ff4d9e72"
},
"aarch64_macos": {
"etag": "0x8DEAAD162CCEBC5",
"hash": "0b3b3dd0fbab7b95217280248196bde741b47b8de7bf60de50b4a12a9cc17b1f"
},
"aarch64_windows": {
"etag": "0x8DEAAD162A434DC",
"hash": "892cb69e81c5c77c8af23dd930d4bcf578b8f62765ee00e3ba8fb76d2035eb34"
},
"riscv64_linux_gnu": {
"etag": "0x8DEAAD1647231E0",
"hash": "8cc1fa33a4cc1fe97312d22558140842324bcc03cde679c01d49bd5d0e16a153"
},
"s390x_linux_gnu": {
"etag": "0x8DEAAD164AE81D1",
"hash": "dd447503753d9269894cf9cbc651c493aa0530525bee12f415555d3772860a06"
}
},
"0.3.12": {
"x86_64_linux_musl": {
"etag": "0x8DEAA7D00F52541",
"hash": "6e4874a2d83451df4946e81f161dc8c6bdc675064cca1f2e1e8b0921dc862ae8"
},
"x86_64_macos": {
"etag": "0x8DEAA7D008188C4",
"hash": "ed4aa96e2c71a29d30d5e8e8b173155cda9f6aea9822e4773ccff70da5a8287a"
},
"x86_64_windows": {
"etag": "0x8DEAA7D00B66709",
"hash": "b75cdae3279806c7a046b18c45c601fe3ec1a380f11911bc39c5273100e18fce"
},
"aarch64_linux_musl": {
"etag": "0x8DEAA7CFF326611",
"hash": "2d7bc8ce9bb8521a2b9f67ad23d556fbf208a8cf5d141f09c3dbae919df756aa"
},
"aarch64_macos": {
"etag": "0x8DEAA7CFEEC3638",
"hash": "8e31a0e21c2d70e0583500f728e2c1aaba45c397a2ef2c4ea43afb7cd64f5d04"
},
"aarch64_windows": {
"etag": "0x8DEAA7CFEF85D7F",
"hash": "6f69d45aa32571e9c34104564dd06a32b7aeec9802831a00a5074fa1a89d5ba9"
},
"riscv64_linux_gnu": {
"etag": "0x8DEAA7D0042F174",
"hash": "c4b23c1b7381f251499bba7e5d01c356a39b313f8fe0a5bf53a0e1f4f7d8d91a"
},
"s390x_linux_gnu": {
"etag": "0x8DEAA7D006A2383",
"hash": "5b6073abfcfd85c692c6e0f71185f24af911b55d6303a4dfa65fb0c6951d3ede"
}
},
"0.3.11": { "0.3.11": {
"x86_64_linux_musl": { "x86_64_linux_musl": {
"etag": "0x8DEA414EFB86FDD", "etag": "0x8DEA414EFB86FDD",

40
manifests/tombi.json generated
View File

@@ -2,10 +2,46 @@
"rust_crate": null, "rust_crate": null,
"template": null, "template": null,
"latest": { "latest": {
"version": "0.10.2" "version": "0.10.3"
}, },
"0.10": { "0.10": {
"version": "0.10.2" "version": "0.10.3"
},
"0.10.4": {
"x86_64_linux_musl": {
"url": "https://github.com/tombi-toml/tombi/releases/download/v0.10.4/tombi-cli-0.10.4-x86_64-unknown-linux-musl.tar.gz",
"etag": "0x8DEAA621E82D459",
"hash": "2988df7c5ac115dc20ebd42f45ba039df0b8cda110b444f419bec814db2c880a",
"bin": "tombi-cli-0.10.4-x86_64-unknown-linux-musl/tombi"
},
"x86_64_macos": {
"url": "https://github.com/tombi-toml/tombi/releases/download/v0.10.4/tombi-cli-0.10.4-x86_64-apple-darwin.tar.gz",
"etag": "0x8DEAA621E732E8B",
"hash": "f3ba04e491d0e2dbf42ecf6fc5d0e0c54d2b71cc74c8a4f59d34717a57544d15",
"bin": "tombi-cli-0.10.4-x86_64-apple-darwin/tombi"
},
"x86_64_windows": {
"url": "https://github.com/tombi-toml/tombi/releases/download/v0.10.4/tombi-cli-0.10.4-x86_64-pc-windows-msvc.zip",
"etag": "0x8DEAA621EFE096F",
"hash": "150c3b9f0ddb3a16faec88980df034889f618d671bdeecec4a49e45f507a4a7d"
},
"aarch64_linux_musl": {
"url": "https://github.com/tombi-toml/tombi/releases/download/v0.10.4/tombi-cli-0.10.4-aarch64-unknown-linux-musl.tar.gz",
"etag": "0x8DEAA621E95363E",
"hash": "0aac20f61dc0ead3eab386ecaf176ad19b8734e02a2efc031bbaeefc3ace7661",
"bin": "tombi-cli-0.10.4-aarch64-unknown-linux-musl/tombi"
},
"aarch64_macos": {
"url": "https://github.com/tombi-toml/tombi/releases/download/v0.10.4/tombi-cli-0.10.4-aarch64-apple-darwin.tar.gz",
"etag": "0x8DEAA621EE6566A",
"hash": "efff1d4fd57364c1b6f0ab7045006ed58d6fdf79925022213d44f4e0993a37a1",
"bin": "tombi-cli-0.10.4-aarch64-apple-darwin/tombi"
},
"aarch64_windows": {
"url": "https://github.com/tombi-toml/tombi/releases/download/v0.10.4/tombi-cli-0.10.4-aarch64-pc-windows-msvc.zip",
"etag": "0x8DEAA621E83490D",
"hash": "2a035a8a3b51dcc5cbff9c84391734499acf7d70279ecf317fc717d22e003647"
}
}, },
"0.10.3": { "0.10.3": {
"x86_64_linux_musl": { "x86_64_linux_musl": {

38
manifests/uv.json generated
View File

@@ -73,6 +73,44 @@
"0.11": { "0.11": {
"version": "0.11.8" "version": "0.11.8"
}, },
"0.11.10": {
"x86_64_linux_musl": {
"etag": "0x8DEAAE44DCF49FB",
"hash": "e3e78e7698d72c133c5ce851a6d60ee83afdc4c0edced382af9fd1f8e11d0105"
},
"x86_64_macos": {
"etag": "0x8DEAAE44CEF82BE",
"hash": "8fd091211089973f528e147166e3af683ab4ecebd4312a55d0d17d87adbde67a"
},
"x86_64_windows": {
"etag": "0x8DEAAE44D040512",
"hash": "7a0c424c7bc55a74751f13592235953ebbe182fa00355f7ae3fb7ab734a51638"
},
"aarch64_linux_musl": {
"etag": "0x8DEAAE44A345FEE",
"hash": "14c21bef6b54d268c6583d851095a543e6cb03a8e4bdca9a44ab91532b14cbc2"
},
"aarch64_macos": {
"etag": "0x8DEAAE4496FA369",
"hash": "e93d6af7dfff7071edd16342ba9eeccfc28d8a7deaa5707efeecf63a63a74453"
},
"aarch64_windows": {
"etag": "0x8DEAAE449BDB9A2",
"hash": "3d5878cfc55106083ada1e41cccdde477413701eb9d34767e8ad973bb0863de6"
},
"powerpc64le_linux_gnu": {
"etag": "0x8DEAAE44C0F6DBE",
"hash": "dfe5b338e2ebc1e5a2850a17bce35edb8e47550c221d9245c007eaf3003cb6ed"
},
"riscv64_linux_gnu": {
"etag": "0x8DEAAE44C34CD09",
"hash": "0c8776a0814bf7e32e025d13c733c3a800171a16fba77d1c21e6f10be6a28d8b"
},
"s390x_linux_gnu": {
"etag": "0x8DEAAE44CE003C6",
"hash": "66dfdc5a216a9fbd7c2541a66f753544dddbcbb2f7a597c9bbc91d10af534c7d"
}
},
"0.11.8": { "0.11.8": {
"x86_64_linux_musl": { "x86_64_linux_musl": {
"etag": "0x8DEA45F71233F4B", "etag": "0x8DEA45F71233F4B",

86
tools/ci/release-post-commit.sh Executable file
View File

@@ -0,0 +1,86 @@
#!/usr/bin/env bash
# SPDX-License-Identifier: Apache-2.0 OR MIT
set -CeEuo pipefail
IFS=$'\n\t'
trap -- 's=$?; printf >&2 "%s\n" "${0##*/}:${LINENO}: \`${BASH_COMMAND}\` exit with ${s}"; exit ${s}' ERR
cd -- "$(dirname -- "$0")"/../..
tools=()
for tool in tools/codegen/base/*.json; do
tool="${tool##*/}"
tools+=("${tool%.*}")
done
# Aliases.
# NB: Update case for aliases in main.sh, tool input option in test-alias job
# in .github/workflows/ci.yml, and match for alias for tools/codegen/src/tools-markdown.rs.
tools+=(
nextest
taplo-cli
typos-cli
wasm-bindgen-cli
wasmtime-cli
)
# Non-manifest-based tools.
tools+=(
rust
valgrind
)
for tool in "${tools[@]}"; do
(
set -x
git checkout -b "releases/${tool}"
sed -Ei action.yml \
-e "s/required: true/required: false/g" \
-e "s/# default: #publish:tool/default: ${tool}/g"
git add action.yml
git commit -m "${tool}"
git tag -f "${tool}"
git checkout main
)
refs+=",+refs/heads/releases/${tool},+refs/tags/${tool}"
done
set -x
# Copy manifests to tmp dir.
manifests=/tmp/manifests
rm -rf -- "${manifests}"
mkdir -p -- "${manifests}"
cp -- ./manifests/* "${manifests}"
# Checkout manifest-schema branch
schema_version="$(grep -Eo "^version = \".*\" #publish:version" tools/manifest-schema/Cargo.toml)"
schema_version="$(cut -d\" -f2 <<<"${schema_version}")"
if [[ "${schema_version}" == '0.'* ]]; then
schema_version="0.$(cut -d. -f2 <<<"${schema_version}")"
else
schema_version="$(cut -d. -f1 <<<"${schema_version}")"
fi
schema_branch="manifest-schema-${schema_version}"
refs+=",refs/heads/${schema_branch}"
if git fetch origin "${schema_branch}"; then
git checkout "origin/${schema_branch}" -B "${schema_branch}"
elif ! git checkout "${schema_branch}"; then
# New branch with no history. Credit: https://stackoverflow.com/a/13969482
git checkout --orphan "${schema_branch}"
git rm -rf -- . || true
git commit -m 'Initial commit' --allow-empty
fi
# Copy over schema
cp -- "${manifests}"/* ./
# Stage changes
git add .
# Detect changes, then commit and push if changes exist
if [[ "$(git status --porcelain=v1 | LC_ALL=C wc -l)" != "0" ]]; then
git commit -m 'Update manifest schema'
fi
git checkout main
printf 'additional-refs: %s\n' "${refs}"
if [[ -n "${GITHUB_OUTPUT:-}" ]]; then
printf 'additional-refs=%s\n' "${refs}" >>"${GITHUB_OUTPUT}"
fi

View File

@@ -4,6 +4,7 @@
"tag_prefix": "", "tag_prefix": "",
"rust_crate": "${package}", "rust_crate": "${package}",
"version_range": ">= 0.8.16", "version_range": ">= 0.8.16",
"ignore": ["0.11.9"],
"signing": { "signing": {
"version_range": ">= 0.9.13", "version_range": ">= 0.9.13",
"kind": { "kind": {

View File

@@ -31,9 +31,13 @@ pub struct BaseManifest {
/// Path to binaries in archive. Default to `${tool}${exe}`. /// Path to binaries in archive. Default to `${tool}${exe}`.
pub bin: Option<StringOrArray>, pub bin: Option<StringOrArray>,
pub signing: Option<Signing>, pub signing: Option<Signing>,
pub version_range: Option<String>,
/// Include to manifest, but exclude from candidate for latest and omitted versions.
#[serde(default)] #[serde(default)]
pub broken: Vec<semver::Version>, pub broken: Vec<semver::Version>,
pub version_range: Option<String>, /// Exclude from manifest.
#[serde(default)]
pub ignore: Vec<semver::Version>,
/// Use glibc build if host_env is gnu. /// Use glibc build if host_env is gnu.
#[serde(default)] #[serde(default)]
pub prefer_linux_gnu: bool, pub prefer_linux_gnu: bool,

View File

@@ -96,7 +96,11 @@ fn main() {
semver_version = format!("{default_major_version}.{version}").parse(); semver_version = format!("{default_major_version}.{version}").parse();
} }
} }
Some((Reverse(semver_version.ok()?), (version, release))) let semver_version = semver_version.ok()?;
if base_info.ignore.contains(&semver_version) {
return None;
}
Some((Reverse(semver_version), (version, release)))
}) })
.collect(); .collect();

View File

@@ -17,7 +17,7 @@ targets=(
powerpc64le-unknown-linux-gnu powerpc64le-unknown-linux-gnu
powerpc64le-unknown-linux-musl powerpc64le-unknown-linux-musl
riscv64gc-unknown-linux-gnu riscv64gc-unknown-linux-gnu
# riscv64gc-unknown-linux-musl # tier 2 without host tools # riscv64gc-unknown-linux-musl # tier 2 without host tools: TODO: https://github.com/rust-lang/rust/issues/156191
s390x-unknown-linux-gnu s390x-unknown-linux-gnu
# s390x-unknown-linux-musl # tier 3 # s390x-unknown-linux-musl # tier 3
x86_64-apple-darwin x86_64-apple-darwin