mirror of
https://github.com/BurntSushi/ripgrep.git
synced 2025-05-19 01:30:21 -07:00
ci: replace mips with powerpc64, aarch64 and s390x
We drop our MIPS target because it no longer works.[1] We were
previously using it as a means of testing ripgrep in a big endian
environment. So to achieve that without MIPS, we test on powerpc64 and
s390x. (No particular reason to do both, but why not.)
We also add aarch64 as a proxy for at least ensuring everything works
for the same architecture as Apple silicon. It's not a guarantee that
everything works, but it seems better than nothing until we can actually
test Apple silicon in CI.
[1]: c788378d6f
This commit is contained in:
parent
51765f2f4c
commit
6cdea9a631
89
.github/workflows/ci.yml
vendored
89
.github/workflows/ci.yml
vendored
@ -6,6 +6,27 @@ on:
|
|||||||
- master
|
- master
|
||||||
schedule:
|
schedule:
|
||||||
- cron: '00 01 * * *'
|
- cron: '00 01 * * *'
|
||||||
|
|
||||||
|
# The section is needed to drop write-all permissions that are granted on
|
||||||
|
# `schedule` event. By specifying any permission explicitly all others are set
|
||||||
|
# to none. By using the principle of least privilege the damage a compromised
|
||||||
|
# workflow can do (because of an injection or compromised third party tool or
|
||||||
|
# action) is restricted. Currently the worklow doesn't need any additional
|
||||||
|
# permission except for pulling the code. Adding labels to issues, commenting
|
||||||
|
# on pull-requests, etc. may need additional permissions:
|
||||||
|
#
|
||||||
|
# Syntax for this section:
|
||||||
|
# https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#permissions
|
||||||
|
#
|
||||||
|
# Reference for how to assign permissions on a job-by-job basis:
|
||||||
|
# https://docs.github.com/en/actions/using-jobs/assigning-permissions-to-jobs
|
||||||
|
#
|
||||||
|
# Reference for available permissions that we can enable if needed:
|
||||||
|
# https://docs.github.com/en/actions/security-guides/automatic-token-authentication#permissions-for-the-github_token
|
||||||
|
permissions:
|
||||||
|
# to fetch code (actions/checkout)
|
||||||
|
contents: read
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
test:
|
test:
|
||||||
name: test
|
name: test
|
||||||
@ -14,32 +35,21 @@ jobs:
|
|||||||
# systems.
|
# systems.
|
||||||
CARGO: cargo
|
CARGO: cargo
|
||||||
# When CARGO is set to CROSS, this is set to `--target matrix.target`.
|
# When CARGO is set to CROSS, this is set to `--target matrix.target`.
|
||||||
|
# Note that we only use cross on Linux, so setting a target on a
|
||||||
|
# different OS will just use normal cargo.
|
||||||
TARGET_FLAGS:
|
TARGET_FLAGS:
|
||||||
# When CARGO is set to CROSS, TARGET_DIR includes matrix.target.
|
# When CARGO is set to CROSS, TARGET_DIR includes matrix.target.
|
||||||
TARGET_DIR: ./target
|
TARGET_DIR: ./target
|
||||||
|
# Bump this as appropriate. We pin to a version to make sure CI
|
||||||
|
# continues to work as cross releases in the past have broken things
|
||||||
|
# in subtle ways.
|
||||||
|
CROSS_VERSION: v0.2.5
|
||||||
# Emit backtraces on panics.
|
# Emit backtraces on panics.
|
||||||
RUST_BACKTRACE: 1
|
RUST_BACKTRACE: 1
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
strategy:
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
build:
|
|
||||||
# We test ripgrep on a pinned version of Rust, along with the moving
|
|
||||||
# targets of 'stable' and 'beta' for good measure.
|
|
||||||
- pinned
|
|
||||||
- stable
|
|
||||||
- beta
|
|
||||||
# Our release builds are generated by a nightly compiler to take
|
|
||||||
# advantage of the latest optimizations/compile time improvements. So
|
|
||||||
# we test all of them here. (We don't do mips releases, but test on
|
|
||||||
# mips for big-endian coverage.)
|
|
||||||
- nightly
|
|
||||||
- nightly-musl
|
|
||||||
- nightly-32
|
|
||||||
- nightly-mips
|
|
||||||
- nightly-arm
|
|
||||||
- macos
|
|
||||||
- win-msvc
|
|
||||||
- win-gnu
|
|
||||||
include:
|
include:
|
||||||
- build: pinned
|
- build: pinned
|
||||||
os: ubuntu-latest
|
os: ubuntu-latest
|
||||||
@ -53,27 +63,26 @@ jobs:
|
|||||||
- build: nightly
|
- build: nightly
|
||||||
os: ubuntu-latest
|
os: ubuntu-latest
|
||||||
rust: nightly
|
rust: nightly
|
||||||
- build: nightly-musl
|
- build: stable-musl
|
||||||
os: ubuntu-latest
|
os: ubuntu-latest
|
||||||
rust: nightly
|
rust: stable
|
||||||
target: x86_64-unknown-linux-musl
|
target: x86_64-unknown-linux-musl
|
||||||
- build: nightly-32
|
- build: stable-x86
|
||||||
os: ubuntu-latest
|
os: ubuntu-latest
|
||||||
rust: nightly
|
rust: stable
|
||||||
target: i686-unknown-linux-gnu
|
target: i686-unknown-linux-gnu
|
||||||
- build: nightly-mips
|
- build: stable-aarch64
|
||||||
os: ubuntu-latest
|
os: ubuntu-latest
|
||||||
rust: nightly
|
rust: stable
|
||||||
target: mips64-unknown-linux-gnuabi64
|
target: aarch64-unknown-linux-gnu
|
||||||
- build: nightly-arm
|
- build: stable-powerpc64
|
||||||
os: ubuntu-latest
|
os: ubuntu-latest
|
||||||
rust: nightly
|
rust: stable
|
||||||
# For stripping release binaries:
|
target: powerpc64-unknown-linux-gnu
|
||||||
# docker run --rm -v $PWD/target:/target:Z \
|
- build: stable-s390x
|
||||||
# rustembedded/cross:arm-unknown-linux-gnueabihf \
|
os: ubuntu-latest
|
||||||
# arm-linux-gnueabihf-strip \
|
rust: stable
|
||||||
# /target/arm-unknown-linux-gnueabihf/debug/rg
|
target: s390x-unknown-linux-gnu
|
||||||
target: arm-unknown-linux-gnueabihf
|
|
||||||
- build: macos
|
- build: macos
|
||||||
os: macos-latest
|
os: macos-latest
|
||||||
rust: nightly
|
rust: nightly
|
||||||
@ -103,9 +112,17 @@ jobs:
|
|||||||
toolchain: ${{ matrix.rust }}
|
toolchain: ${{ matrix.rust }}
|
||||||
|
|
||||||
- name: Use Cross
|
- name: Use Cross
|
||||||
if: matrix.target != ''
|
if: matrix.os == 'ubuntu-latest' && matrix.target != ''
|
||||||
run: |
|
run: |
|
||||||
cargo install cross
|
# In the past, new releases of 'cross' have broken CI. So for now, we
|
||||||
|
# pin it. We also use their pre-compiled binary releases because cross
|
||||||
|
# has over 100 dependencies and takes a bit to compile.
|
||||||
|
dir="$RUNNER_TEMP/cross-download"
|
||||||
|
mkdir "$dir"
|
||||||
|
echo "$dir" >> $GITHUB_PATH
|
||||||
|
cd "$dir"
|
||||||
|
curl -LO "https://github.com/cross-rs/cross/releases/download/$CROSS_VERSION/cross-x86_64-unknown-linux-musl.tar.gz"
|
||||||
|
tar xf cross-x86_64-unknown-linux-musl.tar.gz
|
||||||
echo "CARGO=cross" >> $GITHUB_ENV
|
echo "CARGO=cross" >> $GITHUB_ENV
|
||||||
echo "TARGET_FLAGS=--target ${{ matrix.target }}" >> $GITHUB_ENV
|
echo "TARGET_FLAGS=--target ${{ matrix.target }}" >> $GITHUB_ENV
|
||||||
echo "TARGET_DIR=./target/${{ matrix.target }}" >> $GITHUB_ENV
|
echo "TARGET_DIR=./target/${{ matrix.target }}" >> $GITHUB_ENV
|
||||||
@ -177,7 +194,6 @@ jobs:
|
|||||||
run: ci/test-complete
|
run: ci/test-complete
|
||||||
|
|
||||||
rustfmt:
|
rustfmt:
|
||||||
name: rustfmt
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
@ -191,7 +207,6 @@ jobs:
|
|||||||
run: cargo fmt --all --check
|
run: cargo fmt --all --check
|
||||||
|
|
||||||
docs:
|
docs:
|
||||||
name: Docs
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
|
12
Cross.toml
12
Cross.toml
@ -4,9 +4,11 @@ image = "burntsushi/cross:x86_64-unknown-linux-musl"
|
|||||||
[target.i686-unknown-linux-gnu]
|
[target.i686-unknown-linux-gnu]
|
||||||
image = "burntsushi/cross:i686-unknown-linux-gnu"
|
image = "burntsushi/cross:i686-unknown-linux-gnu"
|
||||||
|
|
||||||
[target.mips64-unknown-linux-gnuabi64]
|
[target.aarch64-unknown-linux-gnu]
|
||||||
image = "burntsushi/cross:mips64-unknown-linux-gnuabi64"
|
image = "burntsushi/cross:aarch64-unknown-linux-gnu"
|
||||||
build-std = true
|
|
||||||
|
|
||||||
[target.arm-unknown-linux-gnueabihf]
|
[target.powerpc64-unknown-linux-gnu]
|
||||||
image = "burntsushi/cross:arm-unknown-linux-gnueabihf"
|
image = "burntsushi/cross:powerpc64-unknown-linux-gnu"
|
||||||
|
|
||||||
|
[target.s390x-unknown-linux-gnu]
|
||||||
|
image = "burntsushi/cross:s390x-unknown-linux-gnu"
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
FROM rustembedded/cross:arm-unknown-linux-gnueabihf
|
FROM rustembedded/cross:aarch64-unknown-linux-gnu
|
||||||
|
|
||||||
COPY stage/ubuntu-install-packages /
|
COPY stage/ubuntu-install-packages /
|
||||||
RUN /ubuntu-install-packages
|
RUN /ubuntu-install-packages
|
@ -2,4 +2,4 @@
|
|||||||
|
|
||||||
mkdir -p stage
|
mkdir -p stage
|
||||||
cp ../../ubuntu-install-packages ./stage/
|
cp ../../ubuntu-install-packages ./stage/
|
||||||
docker build -t burntsushi/cross:arm-unknown-linux-gnueabihf .
|
docker build -t burntsushi/cross:aarch64-unknown-linux-gnu .
|
@ -1,4 +1,4 @@
|
|||||||
FROM rustembedded/cross:mips64-unknown-linux-gnuabi64
|
FROM rustembedded/cross:powerpc64-unknown-linux-gnu
|
||||||
|
|
||||||
COPY stage/ubuntu-install-packages /
|
COPY stage/ubuntu-install-packages /
|
||||||
RUN /ubuntu-install-packages
|
RUN /ubuntu-install-packages
|
@ -2,4 +2,4 @@
|
|||||||
|
|
||||||
mkdir -p stage
|
mkdir -p stage
|
||||||
cp ../../ubuntu-install-packages ./stage/
|
cp ../../ubuntu-install-packages ./stage/
|
||||||
docker build -t burntsushi/cross:mips64-unknown-linux-gnuabi64 .
|
docker build -t burntsushi/cross:powerpc64-unknown-linux-gnu .
|
4
ci/docker/s390x-unknown-linux-gnu/Dockerfile
Normal file
4
ci/docker/s390x-unknown-linux-gnu/Dockerfile
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
FROM rustembedded/cross:s390x-unknown-linux-gnu
|
||||||
|
|
||||||
|
COPY stage/ubuntu-install-packages /
|
||||||
|
RUN /ubuntu-install-packages
|
5
ci/docker/s390x-unknown-linux-gnu/build
Executable file
5
ci/docker/s390x-unknown-linux-gnu/build
Executable file
@ -0,0 +1,5 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
mkdir -p stage
|
||||||
|
cp ../../ubuntu-install-packages ./stage/
|
||||||
|
docker build -t burntsushi/cross:s390x-unknown-linux-gnu .
|
@ -791,6 +791,9 @@ rgtest!(f1466_no_ignore_files, |dir: Dir, mut cmd: TestCommand| {
|
|||||||
rgtest!(f2361_sort_nested_files, |dir: Dir, mut cmd: TestCommand| {
|
rgtest!(f2361_sort_nested_files, |dir: Dir, mut cmd: TestCommand| {
|
||||||
use std::{thread::sleep, time::Duration};
|
use std::{thread::sleep, time::Duration};
|
||||||
|
|
||||||
|
if crate::util::is_cross() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
dir.create("foo", "1");
|
dir.create("foo", "1");
|
||||||
sleep(Duration::from_millis(100));
|
sleep(Duration::from_millis(100));
|
||||||
dir.create_dir("dir");
|
dir.create_dir("dir");
|
||||||
|
@ -1100,12 +1100,18 @@ rgtest!(sort_files, |dir: Dir, mut cmd: TestCommand| {
|
|||||||
});
|
});
|
||||||
|
|
||||||
rgtest!(sort_accessed, |dir: Dir, mut cmd: TestCommand| {
|
rgtest!(sort_accessed, |dir: Dir, mut cmd: TestCommand| {
|
||||||
|
if crate::util::is_cross() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
sort_setup(dir);
|
sort_setup(dir);
|
||||||
let expected = "a:test\ndir/c:test\nb:test\ndir/d:test\n";
|
let expected = "a:test\ndir/c:test\nb:test\ndir/d:test\n";
|
||||||
eqnice!(expected, cmd.args(["--sort", "accessed", "test"]).stdout());
|
eqnice!(expected, cmd.args(["--sort", "accessed", "test"]).stdout());
|
||||||
});
|
});
|
||||||
|
|
||||||
rgtest!(sortr_accessed, |dir: Dir, mut cmd: TestCommand| {
|
rgtest!(sortr_accessed, |dir: Dir, mut cmd: TestCommand| {
|
||||||
|
if crate::util::is_cross() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
sort_setup(dir);
|
sort_setup(dir);
|
||||||
let expected = "dir/d:test\nb:test\ndir/c:test\na:test\n";
|
let expected = "dir/d:test\nb:test\ndir/c:test\na:test\n";
|
||||||
eqnice!(expected, cmd.args(["--sortr", "accessed", "test"]).stdout());
|
eqnice!(expected, cmd.args(["--sortr", "accessed", "test"]).stdout());
|
||||||
|
@ -464,19 +464,39 @@ fn dir_list<P: AsRef<Path>>(dir: P) -> Vec<String> {
|
|||||||
/// will have setup qemu to run it. While this is integrated into the Rust
|
/// will have setup qemu to run it. While this is integrated into the Rust
|
||||||
/// testing by default, we need to handle it ourselves for integration tests.
|
/// testing by default, we need to handle it ourselves for integration tests.
|
||||||
///
|
///
|
||||||
/// Thankfully, cross sets an environment variable that points to the proper
|
/// Now thankfully, cross sets `CROSS_RUNNER` to point to the right qemu
|
||||||
/// qemu binary that we want to run. So we just search for that env var and
|
/// executable. Or so one thinks. But it seems to always be set to `qemu-user`
|
||||||
/// return its value if we could find it.
|
/// and I cannot find `qemu-user` anywhere in the Docker image. Awesome.
|
||||||
|
///
|
||||||
|
/// Thers is `/linux-runner` which seems to work sometimes? But not always.
|
||||||
|
///
|
||||||
|
/// Instead, it looks like we have to use `qemu-aarch64` in the `aarch64`
|
||||||
|
/// case. Perfect, so just get the current target architecture and append it
|
||||||
|
/// to `qemu-`. Wrong. Cross (or qemu or whoever) uses `qemu-ppc64` for
|
||||||
|
/// `powerpc64`, so we can't just use the target architecture as Rust knows
|
||||||
|
/// it verbatim.
|
||||||
|
///
|
||||||
|
/// So... we just manually handle these cases. So fucking fun.
|
||||||
fn cross_runner() -> Option<String> {
|
fn cross_runner() -> Option<String> {
|
||||||
for (k, v) in std::env::vars_os() {
|
let runner = std::env::var("CROSS_RUNNER").ok()?;
|
||||||
let (k, v) = (k.to_string_lossy(), v.to_string_lossy());
|
if runner.is_empty() {
|
||||||
if !k.starts_with("CARGO_TARGET_") && !k.ends_with("_RUNNER") {
|
return None;
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
if !v.starts_with("qemu-") {
|
if cfg!(target_arch = "powerpc64") {
|
||||||
continue;
|
Some("qemu-ppc64".to_string())
|
||||||
|
} else if cfg!(target_arch = "x86") {
|
||||||
|
Some("i386".to_string())
|
||||||
|
} else {
|
||||||
|
// Make a guess... Sigh.
|
||||||
|
Some(format!("qemu-{}", std::env::consts::ARCH))
|
||||||
}
|
}
|
||||||
return Some(v.into_owned());
|
|
||||||
}
|
}
|
||||||
None
|
|
||||||
|
/// Returns true if the test setup believes Cross is running and `qemu` is
|
||||||
|
/// needed to run ripgrep.
|
||||||
|
///
|
||||||
|
/// This is useful because it has been difficult to get some tests to pass
|
||||||
|
/// under Cross.
|
||||||
|
pub fn is_cross() -> bool {
|
||||||
|
std::env::var("CROSS_RUNNER").ok().map_or(false, |v| !v.is_empty())
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user