CI #3980
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: CI | |
on: | |
workflow_dispatch: | |
workflow_call: | |
inputs: | |
additional_key: | |
required: true | |
type: string | |
default: "" | |
merge_group: | |
pull_request: | |
types: | |
- opened | |
- reopened | |
- synchronize | |
schedule: | |
- cron: "0 3 * * 6" | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.ref || github.event.pull_request.number || github.sha }}-${{ inputs.additional_key }} | |
cancel-in-progress: true | |
env: | |
CARGO_TERM_COLOR: always | |
CARGO_REGISTRIES_CRATES_IO_PROTOCOL: sparse | |
JUST_ENABLE_H3: true | |
CARGO_PROFILE_RELEASE_CODEGEN_UNITS: 4 | |
CARGO_PROFILE_DEV_CODEGEN_UNITS: 4 | |
CARGO_PROFILE_CHECK_ONLY_CODEGEN_UNITS: 4 | |
jobs: | |
changed-files: | |
runs-on: ubuntu-latest | |
name: Test changed-files | |
permissions: | |
pull-requests: read | |
outputs: | |
crates_changed: ${{ steps.list-changed-files.outputs.crates_changed }} | |
has_detect_target_changed: ${{ steps.list-changed-files.outputs.has_detect_target_changed }} | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- name: Get changed files | |
id: changed-files | |
uses: tj-actions/changed-files@v45 | |
with: | |
dir_names: true | |
dir_names_exclude_current_dir: true | |
dir_names_max_depth: 2 | |
- name: List all changed files | |
id: list-changed-files | |
env: | |
ALL_CHANGED_FILES: ${{ steps.changed-files.outputs.all_changed_files }} | |
run: | | |
set -euxo pipefail | |
crates_changed="$(for file in $ALL_CHANGED_FILES; do echo $file; done | grep crates | cut -d / -f 2 | sed 's/^bin$/cargo-binstall/' || echo)" | |
has_detect_target_changed="$(echo "$crates_changed" | grep -q detect-targets && echo true || echo false)" | |
echo "crates_changed=${crates_changed//$'\n'/ }" | tee -a "$GITHUB_OUTPUT" | |
echo "has_detect_target_changed=$has_detect_target_changed" | tee -a "$GITHUB_OUTPUT" | |
unit-tests: | |
needs: changed-files | |
runs-on: ubuntu-latest | |
env: | |
CARGO_BUILD_TARGET: x86_64-unknown-linux-gnu | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: ./.github/actions/just-setup | |
env: | |
# just-setup use binstall to install sccache, | |
# which works better when we provide it with GITHUB_TOKEN. | |
GITHUB_TOKEN: ${{ secrets.CI_RELEASE_TEST_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} | |
with: | |
tools: cargo-nextest | |
- name: Decide crates to test | |
shell: bash | |
env: | |
CRATES_CHANGED: ${{ needs.changed-files.outputs.crates_changed }} | |
run: | | |
ARGS="" | |
for crate in $CRATES_CHANGED; do | |
ARGS="$ARGS -p $crate" | |
done | |
echo "CARGO_NEXTEST_ADDITIONAL_ARGS=$ARGS" | tee -a "$GITHUB_ENV" | |
- run: just unit-tests | |
if: env.CARGO_NEXTEST_ADDITIONAL_ARGS != '' | |
env: | |
GITHUB_TOKEN: ${{ secrets.CI_TEST_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} | |
CI_UNIT_TEST_GITHUB_TOKEN: ${{ secrets.CI_UNIT_TEST_GITHUB_TOKEN }} | |
e2e-tests: | |
if: github.event_name != 'pull_request' | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- target: aarch64-apple-darwin | |
os: macos-latest | |
- target: x86_64-unknown-linux-gnu | |
os: ubuntu-latest | |
- target: x86_64-pc-windows-msvc | |
os: windows-latest | |
runs-on: ${{ matrix.os }} | |
env: | |
CARGO_BUILD_TARGET: ${{ matrix.target }} | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: ./.github/actions/just-setup | |
env: | |
# just-setup use binstall to install sccache, | |
# which works better when we provide it with GITHUB_TOKEN. | |
GITHUB_TOKEN: ${{ secrets.CI_RELEASE_TEST_GITHUB_TOKEN }} | |
- run: just build | |
- run: just e2e-tests | |
env: | |
GITHUB_TOKEN: ${{ secrets.CI_TEST_GITHUB_TOKEN }} | |
cross-check: | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- target: armv7-unknown-linux-musleabihf | |
os: ubuntu-latest | |
- target: armv7-unknown-linux-gnueabihf | |
os: ubuntu-latest | |
- target: aarch64-unknown-linux-musl | |
os: ubuntu-latest | |
- target: aarch64-unknown-linux-gnu | |
os: ubuntu-latest | |
- target: x86_64-unknown-linux-musl | |
os: ubuntu-latest | |
- target: x86_64-apple-darwin | |
os: macos-latest | |
- target: aarch64-pc-windows-msvc | |
os: windows-latest | |
runs-on: ${{ matrix.os }} | |
env: | |
CARGO_BUILD_TARGET: ${{ matrix.target }} | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Enable cargo-zigbuild | |
if: matrix.os == 'ubuntu-latest' | |
run: echo JUST_USE_CARGO_ZIGBUILD=true >> "$GITHUB_ENV" | |
- uses: ./.github/actions/just-setup | |
with: | |
tools: [email protected] | |
env: | |
# just-setup use binstall to install sccache, | |
# which works better when we provide it with GITHUB_TOKEN. | |
GITHUB_TOKEN: ${{ secrets.CI_RELEASE_TEST_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} | |
- run: just avoid-dev-deps | |
- run: just check | |
lint: | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- target: x86_64-apple-darwin | |
os: macos-latest | |
- target: x86_64-unknown-linux-gnu | |
os: ubuntu-latest | |
- target: x86_64-pc-windows-msvc | |
os: windows-latest | |
runs-on: ${{ matrix.os }} | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: ./.github/actions/just-setup | |
env: | |
# just-setup use binstall to install sccache, | |
# which works better when we provide it with GITHUB_TOKEN. | |
GITHUB_TOKEN: ${{ secrets.CI_RELEASE_TEST_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} | |
- run: just toolchain rustfmt,clippy | |
- run: just avoid-dev-deps | |
- run: just lint | |
pr-info: | |
outputs: | |
is-release: ${{ steps.meta.outputs.is-release }} | |
crate: ${{ steps.meta.outputs.crates-names }} | |
runs-on: ubuntu-latest | |
steps: | |
- id: meta | |
if: github.event_name == 'pull_request' | |
uses: cargo-bins/release-meta@v1 | |
with: | |
event-data: ${{ toJSON(github.event) }} | |
extract-notes-under: "### Release notes" | |
release-dry-run: | |
needs: pr-info | |
uses: ./.github/workflows/release-cli.yml | |
if: github.event_name != 'pull_request' | |
secrets: inherit | |
with: | |
info: | | |
{ | |
"is-release": false, | |
"crate": "${{ needs.pr-info.outputs.crate }}", | |
"version": "0.0.0", | |
"notes": "" | |
} | |
CARGO_PROFILE_RELEASE_LTO: no | |
CARGO_PROFILE_RELEASE_CODEGEN_UNITS: 4 | |
detect-targets-build: | |
needs: changed-files | |
if: needs.changed-files.outputs.has_detect_target_changed == 'true' | |
runs-on: ubuntu-latest | |
env: | |
CARGO_BUILD_TARGET: x86_64-unknown-linux-musl | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Install ${{ env.CARGO_BUILD_TARGET }} target | |
run: | | |
rustup target add $CARGO_BUILD_TARGET | |
pip3 install -r zigbuild-requirements.txt | |
- uses: Swatinem/rust-cache@v2 | |
with: | |
cache-all-crates: true | |
- name: Build detect-targets | |
run: | | |
cargo zigbuild --features cli-logging --target $CARGO_BUILD_TARGET | |
# Set working directory here, otherwise `cargo-zigbuild` would download | |
# and build quite a few unused dependencies. | |
working-directory: crates/detect-targets | |
- uses: actions/upload-artifact@v4 | |
with: | |
name: detect-targets | |
path: target/${{ env.CARGO_BUILD_TARGET }}/debug/detect-targets | |
detect-targets-alpine-test: | |
runs-on: ubuntu-latest | |
needs: | |
- detect-targets-build | |
- changed-files | |
if: needs.changed-files.outputs.has_detect_target_changed == 'true' | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: actions/download-artifact@v4 | |
with: | |
name: detect-targets | |
- run: chmod +x detect-targets | |
- name: Run test in alpine | |
run: | | |
docker run --rm \ | |
--mount src="$PWD/detect-targets",dst=/usr/local/bin/detect-targets,type=bind \ | |
--mount src="$PWD/.github/scripts/test-detect-targets-musl.sh",dst=/usr/local/bin/test.sh,type=bind \ | |
alpine /bin/ash -c "apk update && apk add bash && test.sh x86_64-unknown-linux-musl" | |
detect-targets-ubuntu-test: | |
needs: | |
- detect-targets-build | |
- changed-files | |
if: needs.changed-files.outputs.has_detect_target_changed == 'true' | |
strategy: | |
fail-fast: false | |
matrix: | |
os: | |
- ubuntu-20.04 | |
- ubuntu-latest | |
runs-on: ${{ matrix.os }} | |
steps: | |
- uses: actions/download-artifact@v4 | |
with: | |
name: detect-targets | |
- run: chmod +x detect-targets | |
- name: Run test in ubuntu | |
run: | | |
set -exuo pipefail | |
[ "$(./detect-targets)" = "$(printf 'x86_64-unknown-linux-gnu\nx86_64-unknown-linux-musl')" ] | |
detect-targets-more-glibc-test: | |
needs: | |
- detect-targets-build | |
- changed-files | |
if: needs.changed-files.outputs.has_detect_target_changed == 'true' | |
strategy: | |
fail-fast: false | |
matrix: | |
container: | |
- archlinux | |
- fedora:37 | |
- fedora:38 | |
- fedora:39 | |
- fedora | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/download-artifact@v4 | |
with: | |
name: detect-targets | |
- run: chmod +x detect-targets | |
- name: Run test | |
run: | | |
set -exuo pipefail | |
[ "$(docker run --rm \ | |
--mount src="$PWD/detect-targets",dst=/usr/local/bin/detect-targets,type=bind \ | |
${{ matrix.container }} detect-targets )" = "$(printf 'x86_64-unknown-linux-gnu\nx86_64-unknown-linux-musl')" ] | |
detect-targets-nix-test: | |
needs: | |
- detect-targets-build | |
- changed-files | |
if: needs.changed-files.outputs.has_detect_target_changed == 'true' | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/download-artifact@v4 | |
with: | |
name: detect-targets | |
- run: chmod +x detect-targets | |
- name: Run test | |
run: | | |
set -exuo pipefail | |
[ "$(docker run --rm \ | |
--mount src="$PWD/detect-targets",dst=/detect-targets,type=bind \ | |
nixos/nix /detect-targets )" = x86_64-unknown-linux-musl ] | |
detect-targets-android-check: | |
needs: changed-files | |
if: needs.changed-files.outputs.has_detect_target_changed == 'true' | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- target: aarch64-linux-android | |
runs-on: ubuntu-latest | |
env: | |
CARGO_BUILD_TARGET: ${{ matrix.target }} | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Add ${{ matrix.target }} | |
run: rustup target add ${{ matrix.target }} | |
- uses: Swatinem/rust-cache@v2 | |
with: | |
cache-all-crates: true | |
- name: Build detect-targets | |
run: | | |
cargo check --target ${{ matrix.target }} | |
# Set working directory here, otherwise `cargo-check` would download | |
# and build quite a few unused dependencies. | |
working-directory: crates/detect-targets | |
# Dummy job to have a stable name for the "all tests pass" requirement | |
tests-pass: | |
name: Tests pass | |
needs: | |
- unit-tests | |
- e2e-tests | |
- cross-check | |
- lint | |
- release-dry-run | |
- detect-targets-build | |
- detect-targets-alpine-test | |
- detect-targets-ubuntu-test | |
- detect-targets-more-glibc-test | |
- detect-targets-nix-test | |
- detect-targets-android-check | |
if: always() # always run even if dependencies fail | |
runs-on: ubuntu-latest | |
steps: | |
# fail if ANY dependency has failed or cancelled | |
- if: "contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled')" | |
run: exit 1 | |
- run: exit 0 |