From e22b9c4d37b40187db2ee32a56503ebbf7a6894c Mon Sep 17 00:00:00 2001 From: Taiki Endo Date: Sun, 17 May 2026 15:43:16 +0900 Subject: [PATCH] ci: Update config --- .github/.cspell/project-dictionary.txt | 1 - .github/workflows/ci.yml | 373 +++++++++++++------------ tools/ci/tool-list.sh | 11 +- 3 files changed, 202 insertions(+), 183 deletions(-) diff --git a/.github/.cspell/project-dictionary.txt b/.github/.cspell/project-dictionary.txt index e0c997bc..1955ae6c 100644 --- a/.github/.cspell/project-dictionary.txt +++ b/.github/.cspell/project-dictionary.txt @@ -31,7 +31,6 @@ ppcle prek quickinstall rdme -rootfs sccache SHASUMS sigstore diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e9d9c746..7dc5e576 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -32,13 +32,16 @@ concurrency: jobs: miri: + needs: tidy uses: taiki-e/github-actions/.github/workflows/miri.yml@931686d4e4cf88b13e790040727ccde2dba8ec62 # main with: # NB: sync with test job's --exclude option args: --exclude install-action-internal-codegen msrv: + needs: tidy uses: taiki-e/github-actions/.github/workflows/msrv.yml@931686d4e4cf88b13e790040727ccde2dba8ec62 # main test-manifest-schema: + needs: tidy uses: taiki-e/github-actions/.github/workflows/test.yml@931686d4e4cf88b13e790040727ccde2dba8ec62 # main with: # NB: sync with miri job's --exclude option @@ -50,15 +53,18 @@ jobs: security-events: write # for github/codeql-action/* test: + needs: tidy strategy: fail-fast: false matrix: include: # NB: Sync list with https://github.com/taiki-e/checkout-action/blob/HEAD/.github/workflows/ci.yml - - os: ubuntu-22.04 - - os: ubuntu-22.04-arm + # -------------------------------------------------------------------- + # GitHub-hosted runners - os: ubuntu-24.04 - os: ubuntu-24.04-arm + - os: ubuntu-22.04 + - os: ubuntu-22.04-arm - os: ubuntu-slim - os: ubuntu-22.04 tool: major.minor.patch @@ -66,19 +72,19 @@ jobs: tool: major.minor - os: ubuntu-22.04 tool: major - - os: macos-14 + - os: macos-26 - os: macos-15 - os: macos-15-intel - - os: macos-26 - - os: windows-2022 - - os: windows-2022 - bash: msys64 - - os: windows-2022 + - os: macos-14 + - os: windows-2025 + - os: windows-2025 + bash: msys2 + - os: windows-2025 bash: cygwin - - os: windows-2025 - - os: windows-2025 - bash: msys64 - - os: windows-2025 + - os: windows-2022 + - os: windows-2022 + bash: msys2 + - os: windows-2022 bash: cygwin - os: windows-11-arm - os: windows-2022 @@ -87,170 +93,75 @@ jobs: tool: major.minor - os: windows-2022 tool: major - runs-on: ${{ matrix.os }} - timeout-minutes: 60 - steps: - - uses: taiki-e/checkout-action@7d1e50e93dc4fb3bba58f85018fadf77898aee8b # v1.4.2 - # cross attempts to install rust-src when Cargo.toml is available even if `cross --version` - - run: rm -- Cargo.toml - - name: Generate tool list - id: tool-list - run: tools/ci/tool-list.sh "${TOOL}" "${OS}" "${BASH}" >>"${GITHUB_OUTPUT}" - env: - TOOL: ${{ matrix.tool }} - OS: ${{ matrix.os }} - BASH: ${{ matrix.bash }} - - run: | - printf '%s\n' 'C:\msys64\mingw32\bin' >>"${GITHUB_PATH}" - printf '%s\n' 'C:\msys64\usr\bin' >>"${GITHUB_PATH}" - if: matrix.bash == 'msys64' - - run: | - choco install --no-progress --requirechecksums cygwin - printf '%s\n' 'C:\tools\cygwin\bin' >>"${GITHUB_PATH}" - printf '%s\n' 'C:\tools\cygwin\usr\bin' >>"${GITHUB_PATH}" - if: matrix.bash == 'cygwin' - - run: env - - uses: ./ - with: - tool: ${{ steps.tool-list.outputs.tool }} - # Test all shells listed in https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsshell - - name: Test bash - run: just --version && shfmt --version && protoc --version && rustc --version && cargo --version && rustup --version - shell: bash - - name: Test sh - run: just --version && shfmt --version && protoc --version && rustc --version && cargo --version && rustup --version - shell: sh - if: startsWith(matrix.os, 'ubuntu') || startsWith(matrix.os, 'macos') - - name: Test pwsh - run: just --version; shfmt --version; protoc --version; rustc --version; cargo --version; rustup --version - shell: pwsh - if: matrix.os != 'ubuntu-slim' - - name: Test powershell - run: just --version; shfmt --version; protoc --version; rustc --version; cargo --version; rustup --version - shell: powershell - if: startsWith(matrix.os, 'windows') - - name: Test cmd - run: just --version & shfmt --version & protoc --version & rustc --version & cargo --version & rustup --version - shell: cmd # zizmor: ignore[misfeature] used for compatibility testing - if: startsWith(matrix.os, 'windows') - # We use the version output to check the version of cargo-binstall, but they - # several times change the version output format in the past so we need to - # check it with CI. (e.g., 0.14.0->0.16.0 update change it - # from "cargo-binstall " to "") - - run: | - if [[ "$(cargo-binstall binstall -V)" != "$(jq -r '.latest.version' manifests/cargo-binstall.json)" ]]; then - exit 1 - fi - if: matrix.bash != 'cygwin' && matrix.os != 'windows-11-arm' - - test-alias: - runs-on: ubuntu-24.04 - timeout-minutes: 60 - steps: - - uses: taiki-e/checkout-action@7d1e50e93dc4fb3bba58f85018fadf77898aee8b # v1.4.2 - # cross attempts to install rust-src when Cargo.toml is available even if `cross --version` - - run: rm -- Cargo.toml - - run: env - - uses: ./ - with: - # 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. - tool: | - nextest - taplo-cli - typos-cli - wasm-bindgen-cli - wasmtime-cli - - name: Test bash - run: cargo-nextest nextest --version && taplo --version - shell: bash - - name: Test sh - run: cargo-nextest nextest --version && taplo --version - shell: sh - - test-fallback: - strategy: - fail-fast: false - matrix: - include: - - fallback: none - - fallback: cargo-install - - fallback: cargo-binstall - - fallback: cargo-binstall - version: 0.3 - runs-on: ubuntu-24.04-arm - timeout-minutes: 60 - steps: - - uses: taiki-e/checkout-action@7d1e50e93dc4fb3bba58f85018fadf77898aee8b # v1.4.2 - # cross attempts to install rust-src when Cargo.toml is available even if `cross --version` - - run: rm -- Cargo.toml - - run: env - - uses: ./ - id: install - continue-on-error: ${{ matrix.fallback == 'none' }} - with: - tool: parse-changelog@${{ matrix.version || '0.4.6' }} - fallback: ${{ matrix.fallback }} - - run: exit 1 - if: matrix.fallback == 'none' && steps.install.outcome != 'failure' - - name: Test bash - run: parse-changelog --version - shell: bash - if: matrix.fallback != 'none' - - name: Test sh - run: parse-changelog --version - shell: sh - if: matrix.fallback != 'none' - - test-container: - strategy: - fail-fast: false - matrix: - container: - # NB: Sync list with https://github.com/taiki-e/checkout-action/blob/HEAD/.github/workflows/ci.yml - - ubuntu:14.04 # glibc 2.19 - - ubuntu:16.04 # glibc 2.23 - - ubuntu:18.04 # glibc 2.27 - - ubuntu:20.04 # glibc 2.31 - - ubuntu:22.04 # glibc 2.35 - - ubuntu:24.04 # glibc 2.39 - - ubuntu:26.04 # glibc 2.42 - - ubuntu:rolling - - debian:9-slim # glibc 2.24 - - debian:10-slim # glibc 2.28 - - debian:11-slim # glibc 2.31 - - debian:12-slim # glibc 2.36 - - debian:13-slim # glibc 2.41 - - debian:testing - - fedora:latest # glibc 2.39 (as of fedora 40) - - almalinux:8 # glibc 2.28 - - almalinux:8-minimal # glibc 2.28 - - almalinux:9 # glibc 2.34 - - almalinux:9-minimal # glibc 2.34 - - almalinux:10 # glibc 2.39 - - almalinux:10-minimal # glibc 2.39 - - centos:6 # glibc 2.12 - - centos:7 # glibc 2.17 - - opensuse/leap:latest # glibc 2.38 (as of leap 15.6) - - opensuse/tumbleweed:latest # glibc 2.39 (as of 2024-07-19) - # - archlinux:latest # glibc 2.39 (as of 2024-07-19) - - alpine:3.2 # musl 1.1.11 - - alpine:3.14 # musl 1.2.2 - - alpine:3.15 # musl 1.2.2 - - alpine:3.16 # musl 1.2.3 - - alpine:3.17 # musl 1.2.3 - - alpine:3.18 # musl 1.2.4 - - alpine:3.19 # musl 1.2.4 - - alpine:3.20 # musl 1.2.5 - - alpine:3.21 # musl 1.2.5 - - alpine:3.22 # musl 1.2.5 - - alpine:3.23 # musl 1.2.5 - # - openwrt/rootfs:x86-64-openwrt-24.10 # musl 1.2.5 - runs-on: ubuntu-24.04 - timeout-minutes: 60 + # -------------------------------------------------------------------- + # Containers + # -------------------------------------------------------------------- + # Debian-based + - container: debian:sid # glibc + - container: debian:testing # glibc + - container: debian:13-slim # glibc 2.41 + - container: debian:12-slim # glibc 2.36 + - container: debian:11-slim # glibc 2.31, EoL + - container: debian:10-slim # glibc 2.28, EoL, end of LTS + - container: debian:9-slim # glibc 2.24, EoL, end of LTS + - container: debian/eol:jessie-slim # 8, glibc 2.19, EoL, end of LTS + - container: ubuntu:devel # glibc + - container: ubuntu:rolling # glibc + - container: ubuntu:26.04 # glibc 2.43 + - container: ubuntu:24.04 # glibc 2.39 + - container: ubuntu:22.04 # glibc 2.35 + - container: ubuntu:20.04 # glibc 2.31, EoL + - container: ubuntu:18.04 # glibc 2.27, EoL + - container: ubuntu:16.04 # glibc 2.23, EoL, end of ESM + - container: ubuntu:14.04 # glibc 2.19, EoL, end of ESM + # -------------------------------------------------------------------- + # Fedora/RHEL-based + - container: fedora:latest # glibc + - container: centos:7 # glibc 2.17, EoL + - container: centos:6 # glibc 2.12, EoL + - container: almalinux:10 # glibc 2.39 + - container: almalinux:10-minimal # glibc 2.39 + - container: almalinux:9 # glibc 2.34 + - container: almalinux:9-minimal # glibc 2.34 + - container: almalinux:8 # glibc 2.28 + - container: almalinux:8-minimal # glibc 2.28 + # -------------------------------------------------------------------- + # SUSE-based + - container: opensuse/tumbleweed:latest # glibc + - container: opensuse/leap:latest # glibc + # -------------------------------------------------------------------- + # apk + - container: alpine:3.23 # musl 1.2.5 + - container: alpine:3.22 # musl 1.2.5 + - container: alpine:3.21 # musl 1.2.5 + # Skip intermediate versions that have reached EoL by default. + # - container: alpine:3.20 # musl 1.2.5, EoL + # - container: alpine:3.19 # musl 1.2.4, EoL + # - container: alpine:3.18 # musl 1.2.4, EoL + # - container: alpine:3.17 # musl 1.2.3, EoL + # - container: alpine:3.16 # musl 1.2.3, EoL + # - container: alpine:3.15 # musl 1.2.2, EoL + # - container: alpine:3.14 # musl 1.2.2, EoL + # - container: alpine:3.13 # musl 1.2.2, EoL + # - container: alpine:3.12 # musl 1.1.24, EoL + # - container: alpine:3.11 # musl 1.1.24, EoL + # - container: alpine:3.10 # musl 1.1.22, EoL + # - container: alpine:3.9 # musl 1.1.20, EoL + # - container: alpine:3.8 # musl 1.1.19, EoL + # - container: alpine:3.7 # musl 1.1.18, EoL, broken env command + # - container: alpine:3.6 # musl 1.1.16, EoL, broken env command + # - container: alpine:3.5 # musl 1.1.15, EoL + # - container: alpine:3.4 # musl 1.1.14, EoL + # - container: alpine:3.3 # musl 1.1.12, EoL + - container: alpine:3.2 # musl 1.1.11, EoL + # -------------------------------------------------------------------- + # Arch-based + - container: archlinux:latest # glibc + runs-on: ${{ matrix.os || 'ubuntu-24.04' }} + timeout-minutes: 30 container: ${{ matrix.container }} steps: - - name: Install requirements (old debian) + - name: Install requirements (old Debian) run: | # In Debian, the old repositories is removed from the main mirrors some time after EoL. codename=$(grep -E '^VERSION_CODENAME=' /etc/os-release | cut -d= -f2) @@ -258,7 +169,7 @@ jobs: -e 's|security.debian.org|archive.debian.org/|g' \ -e "/${codename}-updates/d" if: startsWith(matrix.container, 'debian:9') || startsWith(matrix.container, 'debian:10') - - name: Install requirements (centos) + - name: Install requirements (CentOS) run: | retry() { for i in {1..10}; do @@ -301,9 +212,22 @@ jobs: - run: rm -- Cargo.toml - name: Generate tool list id: tool-list - run: tools/ci/tool-list.sh "" "${CONTAINER}" >>"${GITHUB_OUTPUT}" + run: tools/ci/tool-list.sh "${TOOL}" "${OS}" "${BASH}" >>"${GITHUB_OUTPUT}" env: - CONTAINER: ${{ matrix.container }} + TOOL: ${{ matrix.tool }} + OS: ${{ matrix.container || matrix.os }} + BASH: ${{ matrix.bash }} + - name: Setup MSYS2 bash + run: | + printf '%s\n' 'C:\msys64\mingw32\bin' >>"${GITHUB_PATH}" + printf '%s\n' 'C:\msys64\usr\bin' >>"${GITHUB_PATH}" + if: matrix.bash == 'msys2' + - name: Setup Cygwin bash + run: | + choco install --no-progress --requirechecksums cygwin + printf '%s\n' 'C:\tools\cygwin\bin' >>"${GITHUB_PATH}" + printf '%s\n' 'C:\tools\cygwin\usr\bin' >>"${GITHUB_PATH}" + if: matrix.bash == 'cygwin' # remove bash installed by checkout-action - run: apk --no-cache del bash shell: sh @@ -311,13 +235,104 @@ jobs: - uses: ./ with: tool: ${{ steps.tool-list.outputs.tool }} + # Test all shells listed in https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsshell + - name: Test bash + run: just --version && shfmt --version && protoc --version && rustc --version && cargo --version && rustup --version + shell: bash + if: matrix.container == '' - name: Test bash run: just --version && shfmt --version shell: bash # TODO: OCI runtime exec failed: exec failed: unable to start container process: exec: "bash": executable file not found in $PATH: unknown - if: (!startsWith(matrix.container, 'opensuse')) + if: matrix.container != '' && !startsWith(matrix.container, 'opensuse') + - name: Test sh + run: just --version && shfmt --version && protoc --version && rustc --version && cargo --version && rustup --version + shell: sh + if: matrix.container == '' - name: Test sh run: just --version && shfmt --version shell: sh # TODO: OCI runtime exec failed: exec failed: unable to start container process: exec: "sh": executable file not found in $PATH: unknown - if: (!startsWith(matrix.container, 'opensuse')) + if: matrix.container != '' && !startsWith(matrix.container, 'opensuse') + - name: Test pwsh + run: just --version; shfmt --version; protoc --version; rustc --version; cargo --version; rustup --version + shell: pwsh + if: matrix.os != 'ubuntu-slim' && matrix.container == '' + - name: Test powershell + run: just --version; shfmt --version; protoc --version; rustc --version; cargo --version; rustup --version + shell: powershell + if: startsWith(matrix.os, 'windows') + - name: Test cmd + run: just --version & shfmt --version & protoc --version & rustc --version & cargo --version & rustup --version + shell: cmd # zizmor: ignore[misfeature] used for compatibility testing + if: startsWith(matrix.os, 'windows') + # We use the version output to check the version of cargo-binstall, but they + # several times change the version output format in the past so we need to + # check it with CI. (e.g., 0.14.0->0.16.0 update change it + # from "cargo-binstall " to "") + - run: | + if [[ "$(cargo-binstall binstall -V)" != "$(jq -r '.latest.version' manifests/cargo-binstall.json)" ]]; then + exit 1 + fi + if: matrix.bash != 'cygwin' && matrix.os != 'windows-11-arm' && !startsWith(matrix.container, 'opensuse') + + test-alias: + needs: tidy + runs-on: ubuntu-24.04 + timeout-minutes: 60 + steps: + - uses: taiki-e/checkout-action@7d1e50e93dc4fb3bba58f85018fadf77898aee8b # v1.4.2 + # cross attempts to install rust-src when Cargo.toml is available even if `cross --version` + - run: rm -- Cargo.toml + - run: env + - uses: ./ + with: + # 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. + tool: | + nextest + taplo-cli + typos-cli + wasm-bindgen-cli + wasmtime-cli + - name: Test bash + run: cargo-nextest nextest --version && taplo --version + shell: bash + - name: Test sh + run: cargo-nextest nextest --version && taplo --version + shell: sh + + test-fallback: + needs: tidy + strategy: + fail-fast: false + matrix: + include: + - fallback: none + - fallback: cargo-install + - fallback: cargo-binstall + - fallback: cargo-binstall + version: 0.3 + runs-on: ubuntu-24.04-arm + timeout-minutes: 60 + steps: + - uses: taiki-e/checkout-action@7d1e50e93dc4fb3bba58f85018fadf77898aee8b # v1.4.2 + # cross attempts to install rust-src when Cargo.toml is available even if `cross --version` + - run: rm -- Cargo.toml + - run: env + - uses: ./ + id: install + continue-on-error: ${{ matrix.fallback == 'none' }} + with: + tool: parse-changelog@${{ matrix.version || '0.4.6' }} + fallback: ${{ matrix.fallback }} + - run: exit 1 + if: matrix.fallback == 'none' && steps.install.outcome != 'failure' + - name: Test bash + run: parse-changelog --version + shell: bash + if: matrix.fallback != 'none' + - name: Test sh + run: parse-changelog --version + shell: sh + if: matrix.fallback != 'none' diff --git a/tools/ci/tool-list.sh b/tools/ci/tool-list.sh index 3403b1a7..ed59effc 100755 --- a/tools/ci/tool-list.sh +++ b/tools/ci/tool-list.sh @@ -119,14 +119,19 @@ case "$(uname -s)" in if ! type -P apt-get >/dev/null; then incompat_tools+=(cyclonedx) fi - if [[ "${runner}" == "ubuntu:14.04" ]]; then + if [[ "${runner}" == 'ubuntu:14.04' ]]; then incompat_tools+=(cyclonedx) fi - if [[ "${runner}" == "almalinux:10"* ]]; then + if [[ "${runner}" == 'almalinux:10'* ]]; then incompat_tools+=(cargo-deb) # no dpkg in package manager fi ;; - Darwin) host_os=macos ;; + Darwin) + host_os=macos + if [[ "${runner}" == 'macos-15-intel' ]]; then + incompat_tools+=(release-plz) # no prebuilt binary + fi + ;; MINGW* | MSYS* | CYGWIN* | Windows_NT) host_os=windows ;; *) bail "unrecognized OS type '$(uname -s)'" ;; esac