Skip to content

Commit

Permalink
Auto merge of rust-lang#133912 - MarcoIeni:test-codebuild-runner, r=<…
Browse files Browse the repository at this point in the history
…try>

[experiment] test code build runner

try-job: x86_64-gnu
  • Loading branch information
bors committed Dec 23, 2024
2 parents 0eca4dd + 0b2fb0a commit 8579ceb
Show file tree
Hide file tree
Showing 8 changed files with 78 additions and 10 deletions.
6 changes: 6 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,10 @@ jobs:
- name: install awscli
run: src/ci/scripts/install-awscli.sh

- if: contains(matrix.os, 'codebuild-ubuntu')
name: Install sotftware for codebuild
run: chmod +x src/ci/scripts/ubuntu-codebuild.sh && ./src/ci/scripts/ubuntu-codebuild.sh

- name: install sccache
run: src/ci/scripts/install-sccache.sh

Expand Down Expand Up @@ -174,6 +178,8 @@ jobs:

- name: enable ipv6 on Docker
run: src/ci/scripts/enable-docker-ipv6.sh
# Don't run on codebuild because systemctl is not available
if: ${{ !contains(matrix.os, 'codebuild-ubuntu') }}

# Disable automatic line ending conversion (again). On Windows, when we're
# installing dependencies, something switches the git configuration directory or
Expand Down
33 changes: 24 additions & 9 deletions src/ci/docker/run.sh
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ root_dir="`dirname $src_dir`"
source "$ci_dir/shared.sh"

if isCI; then
echo "CI detected"
objdir=$root_dir/obj
else
objdir=$root_dir/obj/$image
Expand All @@ -53,6 +54,7 @@ fi
CACHE_DOMAIN="${CACHE_DOMAIN:-ci-caches.rust-lang.org}"

if [ -f "$docker_dir/$image/Dockerfile" ]; then
echo "Dockerfile found for $image"
hash_key=/tmp/.docker-hash-key.txt
rm -f "${hash_key}"
echo $image >> $hash_key
Expand Down Expand Up @@ -149,6 +151,7 @@ if [ -f "$docker_dir/$image/Dockerfile" ]; then
--output=type=docker
# On auto/try builds, we can also write to the cache.
else
echo "Logging into the Docker registry"
# Log into the Docker registry, so that we can read/write cache and the final image
echo ${DOCKER_TOKEN} | docker login ${REGISTRY} \
--username ${REGISTRY_USERNAME} \
Expand All @@ -157,6 +160,7 @@ if [ -f "$docker_dir/$image/Dockerfile" ]; then
# Enable a new Docker driver so that --cache-from/to works with a registry backend
docker buildx create --use --driver docker-container

echo "Building Docker image with cache"
# Build the image using registry caching backend
retry docker \
buildx \
Expand All @@ -165,11 +169,13 @@ if [ -f "$docker_dir/$image/Dockerfile" ]; then
--cache-to type=registry,ref=${CACHE_IMAGE_TAG},compression=zstd \
--output=type=docker

echo "Docker image built"
# Print images for debugging purposes
docker images

# Tag the built image and push it to the registry
docker tag rust-ci "${IMAGE_TAG}"
echo "Pushing Docker image to the registry"
docker push "${IMAGE_TAG}"

# Record the container registry tag/url for reuse, e.g. by rustup.rs builds
Expand Down Expand Up @@ -221,6 +227,7 @@ else
exit 1
fi

echo "Creating directories"
mkdir -p $HOME/.cargo
mkdir -p $objdir/tmp
mkdir -p $objdir/cores
Expand Down Expand Up @@ -276,6 +283,7 @@ args="$args --privileged"
# `LOCAL_USER_ID` (recognized in `src/ci/run.sh`) to ensure that files are all
# read/written as the same user as the bare-metal user.
if [ -f /.dockerenv ]; then
echo "Dockerenv detected. We are in docker-in-docker scenario."
docker create -v /checkout --name checkout alpine:3.4 /bin/true
docker cp . checkout:/checkout
args="$args --volumes-from checkout"
Expand All @@ -284,16 +292,23 @@ else
args="$args --volume $objdir:/checkout/obj"
args="$args --volume $HOME/.cargo:/cargo"
args="$args --volume /tmp/toolstate:/tmp/toolstate"
fi

id=$(id -u)
if [[ "$id" != 0 && "$(docker version)" =~ Podman ]]; then
# Rootless podman creates a separate user namespace, where an inner
# LOCAL_USER_ID will map to a different subuid range on the host.
# The "keep-id" mode maps the current UID directly into the container.
args="$args --env NO_CHANGE_USER=1 --userns=keep-id"
else
args="$args --env LOCAL_USER_ID=$id"
fi
id=$(id -u)
if [[ "$id" != 0 && "$(docker version)" =~ Podman ]]; then
# Rootless podman creates a separate user namespace, where an inner
# LOCAL_USER_ID will map to a different subuid range on the host.
# The "keep-id" mode maps the current UID directly into the container.
echo "Running in rootless podman"
args="$args --env NO_CHANGE_USER=1 --userns=keep-id"
elif [[ "$id" != 0 ]]; then
echo "Running in docker as non-root"
args="$args --env LOCAL_USER_ID=$id"
else
echo "Running in docker as root. Using id 1001."
# If we're running as root, we don't want to run the container as root,
# so we set id `1001` instead of `0`.
args="$args --env LOCAL_USER_ID=1001"
fi

if [ "$dev" = "1" ]
Expand Down
17 changes: 17 additions & 0 deletions src/ci/github-actions/calculate-job-matrix.py
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,21 @@ def format_run_type(run_type: WorkflowRunType) -> str:
raise AssertionError()


# Add new function before main:
def substitute_github_vars(jobs: list) -> list:
"""Replace GitHub context variables with environment variables in job configs."""
for job in jobs:
if "os" in job:
job["os"] = job["os"].replace(
"${{ github.run_id }}",
os.environ["GITHUB_RUN_ID"]
).replace(
"${{ github.run_attempt }}",
os.environ["GITHUB_RUN_ATTEMPT"]
)
return jobs


if __name__ == "__main__":
logging.basicConfig(level=logging.INFO)

Expand All @@ -199,6 +214,8 @@ def format_run_type(run_type: WorkflowRunType) -> str:
if run_type is not None:
jobs = calculate_jobs(run_type, data)
jobs = skip_jobs(jobs, channel)
jobs = substitute_github_vars(jobs)


if not jobs:
raise Exception("Scheduled job list is empty, this is an error")
Expand Down
6 changes: 5 additions & 1 deletion src/ci/github-actions/jobs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,10 @@ runners:
- &job-aarch64-linux
os: ubuntu-22.04-arm64-8core-32gb

- &job-linux-8c-codebuild
os: codebuild-ubuntu-22-8c-${{ github.run_id }}-${{ github.run_attempt }}
<<: *base-job

envs:
env-x86_64-apple-tests: &env-x86_64-apple-tests
SCRIPT: ./x.py --stage 2 test --skip tests/ui --skip tests/rustdoc -- --exact
Expand Down Expand Up @@ -264,7 +268,7 @@ auto:
<<: *job-linux-4c

- image: x86_64-gnu
<<: *job-linux-4c
<<: *job-linux-8c-codebuild

# This job ensures commits landing on nightly still pass the full
# test suite on the stable channel. There are some UI tests that
Expand Down
14 changes: 14 additions & 0 deletions src/ci/run.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,29 @@

set -e

echo "Running inside src/ci/run.sh script"

if [ -n "$CI_JOB_NAME" ]; then
echo "[CI_JOB_NAME=$CI_JOB_NAME]"
fi

echo "whoami: $(whoami). Home: $HOME"
echo "--- current directory ---"
pwd
ls -l
echo "-------------------------"
echo "NO_CHANGE_USER=$NO_CHANGE_USER. LOCAL_USER_ID=$LOCAL_USER_ID"
if [ "$NO_CHANGE_USER" = "" ]; then
echo "can change user"
if [ "$LOCAL_USER_ID" != "" ]; then
echo "Starting with UID: $LOCAL_USER_ID"
id -u user &>/dev/null || useradd --shell /bin/bash -u $LOCAL_USER_ID -o -c "" -m user
export HOME=/home/user
unset LOCAL_USER_ID

# Give ownership of the current directory to the user
chown -R user:user .

# Ensure that runners are able to execute git commands in the worktree,
# overriding the typical git protections. In our docker container we're running
# as root, while the user owning the checkout is not root.
Expand All @@ -21,6 +34,7 @@ if [ "$NO_CHANGE_USER" = "" ]; then
# For NO_CHANGE_USER done in the small number of Dockerfiles affected.
echo -e '[safe]\n\tdirectory = *' > /home/user/.gitconfig

echo "Switching to user"
exec su --preserve-environment -c "env PATH=$PATH \"$0\"" user
fi
fi
Expand Down
6 changes: 6 additions & 0 deletions src/ci/scripts/enable-docker-ipv6.sh
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,12 @@ IFS=$'\n\t'

source "$(cd "$(dirname "$0")" && pwd)/../shared.sh"

# Print docker version
docker --version
lsb_release -a
echo "is docker active"
systemctl is-active docker

if isLinux; then
sudo mkdir -p /etc/docker
echo '{"ipv6":true,"fixed-cidr-v6":"fd9a:8454:6789:13f7::/64"}' \
Expand Down
2 changes: 2 additions & 0 deletions src/ci/scripts/run-build-from-ci.sh
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,9 @@ echo "::add-matcher::src/ci/github-actions/problem_matchers.json"
# the environment
rustup self uninstall -y || true
if [ -z "${IMAGE+x}" ]; then
echo "Running ci/run.sh"
src/ci/run.sh
else
echo "Running docker/run.sh with image ${IMAGE}"
src/ci/docker/run.sh "${IMAGE}"
fi
4 changes: 4 additions & 0 deletions src/ci/scripts/ubuntu-codebuild.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#!/bin/bash

# apt-get update
# apt-get install -y docker-buildx

0 comments on commit 8579ceb

Please sign in to comment.