Docker로 테스트하기
src/ci/docker 디렉터리에는 GitHub Actions에서 실행되는 Linux 기반 작업을 위한 Docker 이미지 정의가 들어 있습니다(Linux가 아닌 작업은 Docker 밖에서 실행됩니다). 이러한 작업은 로컬 개발 머신에서 실행할 수 있으며, 로컬 시스템과 다른 환경을 테스트할 때 유용합니다. Linux, Windows 또는 macOS 시스템에 Docker를 설치해야 합니다(Windows와 macOS는 가상 머신으로 Linux 환경을 에뮬레이션하므로 일반적으로 Linux가 훨씬 빠릅니다).
CI에서 실행되는 작업은 여러 bash 스크립트로 구성되어 있어서 로컬에서 그 동작을 재현하기가 항상 간단하지는 않습니다. CI 작업을 로컬에서 가장 간단하게 실행하려면 CI에서 일어나는 일을 최대한 비슷하게 재현하는 도우미 도구 citool을 사용할 수 있습니다:
cargo run --manifest-path src/ci/citool/Cargo.toml run-local <job-name>
# For example:
cargo run --manifest-path src/ci/citool/Cargo.toml run-local dist-x86_64-linux-alt
위 스크립트가 제대로 동작하지 않거나, Docker 이미지 실행을 더 세밀하게 제어하고 싶거나, Docker 작업이 실행될 때 정확히 무슨 일이 일어나는지 이해하고 싶다면 아래 내용을 계속 읽으십시오.
run.sh 스크립트
src/ci/docker/run.sh 스크립트는 특정 Docker 이미지를 빌드하고 실행한 뒤, 이미지 안에서 Rust를 빌드하고, 테스트를 실행하거나 배포용 아카이브 묶음을 준비하는 데 사용됩니다. 이 스크립트는 로컬 Rust 소스 트리를 읽기 전용 모드로, obj 디렉터리를 읽기-쓰기 모드로 마운트합니다. 모든 컴파일러 산출물은 obj 디렉터리에 저장됩니다. 셸은 obj디렉터리에서 시작합니다. 그곳에서 ../src/ci/run.sh를 실행하며, 이 스크립트는 Docker 이미지에 정의된 대로 빌드를 시작합니다.
src/ci/docker/run.sh <image-name>을 직접 실행할 수 있습니다. run.sh 스크립트와 관련된 몇 가지 중요한 참고 사항은 다음과 같습니다:
- CI에서 실행될 때 이 스크립트는 모든 서브모듈이 체크아웃되어 있다고 가정합니다. 작업이 접근하는 서브모듈 중 사용할 수 없는 것이 있으면 빌드에서 오류가 발생합니다. 따라서 필요한 모든 서브모듈이 로컬에 체크아웃되어 있는지 확인해야 합니다. git으로 직접 체크아웃하거나,
bootstrap.toml에build.submodules = true를 설정하고x build같은 명령을 실행하여 bootstrap이 가장 중요한 서브모듈을 내려받도록 할 수 있습니다. 다만 이것만으로는 실행하려는 CI 작업에 충분하지 않을 수도 있다는 점에 유의하십시오. <image-name>은src/ci/docker/host-*디렉터리 중 하나에 있는 단일 디렉터리에 대응합니다. 이미지 이름이 반드시 작업 이름과 일치하지는 않는다는 점에 유의하십시오. 일부 작업은 같은 이미지를 실행하되 환경 변수나 Docker 빌드 인자를 다르게 사용하기 때문입니다. 이는 CI 작업을 로컬에서 실행하기 어렵게 만드는 복잡성의 일부입니다.- “dist” 작업(
dist-로 시작하는 작업)을 실행하는 경우DEPLOY=1환경 변수를 설정해야 합니다. - “alternative dist” 작업(
dist-로 시작하고-alt로 끝나는 작업)을 실행하는 경우DEPLOY_ALT=1환경 변수를 설정해야 합니다. - 일부 std 테스트는 IPv6 지원이 필요합니다. Linux의 Docker는 기본적으로 이 기능이 비활성화되어 있는 것으로 보입니다. 컨테이너를 만들기 전에
enable-docker-ipv6.sh에 있는 명령을 실행하여 IPv6를 활성화하십시오. 이 작업은 한 번만 하면 됩니다.
대화형 모드
때로는 특정 Docker 이미지를 빌드한 뒤 그 안에서 원하는 명령을 실행하여 해당 시스템이 어떻게 동작하는지 실험해 보는 것이 유용할 수 있습니다. 이를 위해 src/ci/docker/run.sh --dev <image-name>을 사용하여 컨테이너 안에서 bash 셸을 시작하는 대화형 모드를 사용할 수 있습니다.
Docker 컨테이너 안에서는 개별 명령을 실행하여 특정 작업을 수행할 수 있습니다. 예를 들어 ../x test tests/ui를 실행하면 UI 테스트만 실행할 수 있습니다.
대화형 모드 사용에 관한 몇 가지 추가 참고 사항은 다음과 같습니다.
- 셸을 종료하면 컨테이너는 자동으로 삭제되지만, 빌드 산출물은
obj디렉터리에 남습니다. 서로 다른 Docker 이미지를 오가며 사용하는 경우,obj디렉터리에 저장된 이전 환경의 산출물 때문에 빌드 시스템이 혼동할 수 있습니다. 컨테이너 내부에서 빌드하기 전에obj디렉터리의 일부 또는 전체를 삭제해야 할 때도 있습니다. - 컨테이너는 최소한의 패키지만 포함된 기본 구성입니다.
apt install less vim과 같이 필요한 도구를 설치하는 것이 좋습니다. - 컨테이너에서 여러 개의 셸을 열 수 있습니다. 먼저 셸 프롬프트에 표시되는 컨테이너 이름(짧은 해시)이 필요합니다. 또는 컨테이너 외부에서
docker container ls를 실행하여 사용 가능한 컨테이너 목록을 확인할 수 있습니다. 컨테이너 이름을 확인했으면docker exec -it <CONTAINER> /bin/bash를 실행하십시오. 여기서<CONTAINER>는4ba195e95cef와 같은 컨테이너 이름입니다.