diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3083e4cd1..09e5605ec 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -308,8 +308,42 @@ jobs: LATEST: ${{ needs.check.outputs.is-latest || 'false' }} shell: bash + # we should always have an artifact from a previous build. + remote: + needs: [shellcheck, test, check] + runs-on: ubuntu-latest + if: github.actor == 'bors[bot]' + env: + TARGET: aarch64-unknown-linux-gnu + steps: + - uses: actions/checkout@v3 + - uses: ./.github/actions/setup-rust + - run: ./ci/remote.sh + + bisect: + needs: [shellcheck, test, check] + runs-on: ubuntu-latest + if: github.actor == 'bors[bot]' + env: + TARGET: aarch64-unknown-linux-gnu + steps: + - uses: actions/checkout@v3 + - uses: ./.github/actions/setup-rust + - run: ./ci/bisect.sh + + docker-in-docker: + needs: [shellcheck, test, check] + runs-on: ubuntu-latest + if: github.actor == 'bors[bot]' + env: + TARGET: aarch64-unknown-linux-gnu + steps: + - uses: actions/checkout@v3 + - uses: ./.github/actions/setup-rust + - run: ./ci/docker-in-docker.sh + publish: - needs: [build, check] + needs: [build, check, fmt, clippy, cargo-deny, remote, bisect] runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 diff --git a/ci/bisect.sh b/ci/bisect.sh new file mode 100755 index 000000000..5a41e18e4 --- /dev/null +++ b/ci/bisect.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env bash +# shellcheck disable=SC1091,SC1090 + +# test to see that custom toolchains work + +set -x +set -eo pipefail + +if [[ -z "${TARGET}" ]]; then + export TARGET="aarch64-unknown-linux-gnu" +fi + +source=$(dirname "${BASH_SOURCE[0]}") +. "${source}"/shared.sh + +main() { + local td= + local err= + + retry cargo fetch + cargo install --force --path . + cargo install cargo-bisect-rustc + + td="$(mktemp -d)" + git clone --depth 1 https://github.com/cross-rs/rust-cpp-hello-word "${td}" + + pushd "${td}" + retry cargo fetch + echo '#!/usr/bin/env bash +export CROSS_CUSTOM_TOOLCHAIN=1 +exec cross run --target '"${TARGET}" > bisect.sh + chmod +x bisect.sh + + if ! err=$(cargo bisect-rustc --script=./bisect.sh --target "${TARGET}" 2>&1 >/dev/null); then + if [[ "${err}" != *"does not reproduce the regression"* ]]; then + echo "${err}" + exit 1 + fi + else + echo "should have failed, instead succeeded" 1>&2 + exit 1 + fi + popd + + rm -rf "${td}" +} + +main diff --git a/ci/docker-in-docker.sh b/ci/docker-in-docker.sh new file mode 100755 index 000000000..ed91bab9d --- /dev/null +++ b/ci/docker-in-docker.sh @@ -0,0 +1,39 @@ +#!/usr/bin/env bash + +# test to see that running docker-in-docker works + +set -x +set -eo pipefail + +if [[ -z "${TARGET}" ]]; then + export TARGET="aarch64-unknown-linux-gnu" +fi + +source=$(dirname "${BASH_SOURCE[0]}") +source=$(realpath "${source}") +home=$(dirname "${source}") + +main() { + docker run -v "${home}":/project \ + -w /project --rm -e TARGET \ + -v /var/run/docker.sock:/var/run/docker.sock \ + docker:18.09-dind sh -c ' +#!/usr/bin/env sh +apk add curl +curl --proto "=https" --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y +source $HOME/.cargo/env + +# building on release is slow +apk add libgcc gcc musl-dev +cargo install --path . --force --debug + +apk add git +td="$(mktemp -d)" +git clone --depth 1 https://github.com/cross-rs/rust-cpp-hello-word "${td}" +cd "${td}" + +CROSS_CONTAINER_IN_CONTAINER=1 cross run --target "${TARGET}" +' +} + +main diff --git a/ci/remote.sh b/ci/remote.sh new file mode 100755 index 000000000..1f219c5f8 --- /dev/null +++ b/ci/remote.sh @@ -0,0 +1,51 @@ +#!/usr/bin/env bash +# shellcheck disable=SC1091,SC1090 + +# test to see that remote docker support works. + +set -x +set -eo pipefail + +export CROSS_REMOTE=1 +if [[ -z "${TARGET}" ]]; then + export TARGET="aarch64-unknown-linux-gnu" +fi + +source=$(dirname "${BASH_SOURCE[0]}") +. "${source}"/shared.sh + +main() { + local err= + + retry cargo fetch + cargo install --force --path . + + # if the create volume fails, ensure it exists. + if ! err=$(cross-util volumes create 2>&1 >/dev/null); then + if [[ "${err}" != *"already exists"* ]]; then + echo "${err}" + exit 1 + fi + fi + cross_test_cpp + cross-util volumes remove + + # ensure the data volume was removed. + cross_test_cpp +} + +cross_test_cpp() { + local td= + td="$(mktemp -d)" + + git clone --depth 1 https://github.com/cross-rs/rust-cpp-hello-word "${td}" + + pushd "${td}" + retry cargo fetch + cross run --target "${TARGET}" + popd + + rm -rf "${td}" +} + +main diff --git a/ci/shared.sh b/ci/shared.sh new file mode 100755 index 000000000..457861dd7 --- /dev/null +++ b/ci/shared.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash + +function retry { + local tries="${TRIES-5}" + local timeout="${TIMEOUT-1}" + local try=0 + local exit_code=0 + + while (( try < tries )); do + if "${@}"; then + return 0 + else + exit_code=$? + fi + + sleep "${timeout}" + echo "Retrying ..." 1>&2 + try=$(( try + 1 )) + timeout=$(( timeout * 2 )) + done + + return ${exit_code} +} diff --git a/ci/test.sh b/ci/test.sh index d47a52ab9..dba48964c 100755 --- a/ci/test.sh +++ b/ci/test.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# shellcheck disable=SC2086 +# shellcheck disable=SC2086,SC1091,SC1090 set -x set -euo pipefail @@ -8,27 +8,8 @@ set -euo pipefail # installed version on macOS. likewise, "${var[@]}" is an unbound # error if var is an empty array. -function retry { - local tries="${TRIES-5}" - local timeout="${TIMEOUT-1}" - local try=0 - local exit_code=0 - - while (( try < tries )); do - if "${@}"; then - return 0 - else - exit_code=$? - fi - - sleep "${timeout}" - echo "Retrying ..." 1>&2 - try=$(( try + 1 )) - timeout=$(( timeout * 2 )) - done - - return ${exit_code} -} +source=$(dirname "${BASH_SOURCE[0]}") +. "${source}"/shared.sh workspace_test() { "${CROSS[@]}" build --target "${TARGET}" --workspace "$@" ${CROSS_FLAGS} diff --git a/src/bin/commands/containers.rs b/src/bin/commands/containers.rs index fc0582e68..7575f597f 100644 --- a/src/bin/commands/containers.rs +++ b/src/bin/commands/containers.rs @@ -109,9 +109,6 @@ impl CreateVolume { #[derive(Args, Debug)] pub struct RemoveVolume { - /// Triple for the target platform. - #[clap(long)] - pub target: String, /// If cross is running inside a container. #[clap(short, long)] pub docker_in_docker: bool, @@ -473,7 +470,6 @@ pub fn create_persistent_volume( pub fn remove_persistent_volume( RemoveVolume { - target, docker_in_docker, verbose, quiet, @@ -483,9 +479,11 @@ pub fn remove_persistent_volume( engine: &docker::Engine, channel: Option<&str>, ) -> cross::Result<()> { + // we only need a triple that needs docker: the actual target doesn't matter. let msg_info = MessageInfo::create(verbose, quiet, color.as_deref())?; + let triple = cross::Host::X86_64UnknownLinuxGnu.triple(); let (_, _, dirs) = - docker::get_package_info(engine, &target, channel, docker_in_docker, msg_info)?; + docker::get_package_info(engine, triple, channel, docker_in_docker, msg_info)?; let volume = docker::remote::unique_toolchain_identifier(&dirs.sysroot)?; if !docker::remote::volume_exists(engine, &volume, msg_info)? {