Table of Contents
원격 실행의 개념
Bazel의 원격 실행(Remote Execution)은 빌드 및 테스트 작업을 원격 머신이나 클러스터에서 수행할 수 있도록 하는 기능입니다. 이를 통해 로컬 환경의 자원 제약을 피할 수 있으며, 확장 가능하고 병렬화된 원격 환경에서 빌드와 테스트를 빠르게 실행할 수 있습니다. 원격 실행을 사용하면 여러 개발자들도 동일한 빌드 결과를 얻을 수 있어 협업에도 유용합니다.
원격 실행 사용법:
1.
원격 실행 서비스 설정: Bazel 원격 실행을 사용하려면 먼저 원격 실행 서비스를 설정해야 합니다. 예를 들어, Google Cloud Build를 사용하는 경우, 서비스를 설정하고 인증 파일을 준비해야 합니다.
2.
.bazelrc 파일 작성: 프로젝트 루트 디렉토리에 .bazelrc 파일을 생성하고 원격 실행을 사용하도록 Bazel에 지시하는 구성을 작성합니다. 예를 들면:
# 원격 실행 설정
build:remote --remote_executor=grpc://<원격 실행 서버 주소>
build:remote --jobs=<원하는 동시 작업 수>
build:remote --remote_timeout=<원격 작업 제한 시간(초)>
test:remote --remote_executor=grpc://<원격 실행 서버 주소>
test:remote --jobs=<원하는 동시 작업 수>
test:remote --remote_timeout=<원격 작업 제한 시간(초)>
# 원격 캐시 설정
build:remote --remote_cache=grpc://<원격 캐시 서버 주소>
test:remote --remote_cache=grpc://<원격 캐시 서버 주소>
Shell
복사
3.
Bazel 명령어 실행: 원격 실행 옵션을 사용하여 Bazel 빌드와 테스트를 실행합니다. 예를 들어:
$ bazel build --config=remote //...
$ bazel test --config=remote //...
Shell
복사
예제:
다음 예제에서는 Google Cloud Build를 사용하여 원격 실행을 수행하는 방법을 설명합니다.
1.
Google Cloud SDK 설치 및 구성:
$ curl https://sdk.cloud.google.com | bash
$ exec -l $SHELL$ gcloud init
Shell
복사
2.
Google Cloud Build 사용을 위한 설정 및 인증:
$ gcloud auth application-default login
$ gcloud components install alpha
$ gcloud alpha builds worker-pools create my-pool --region=<원하는 리전> --config-from-file=my-pool.yaml
Shell
복사
my-pool.yaml 예제:
vbnetCopy code
name: my-pool
workerConfig:
diskSizeGb: 100
machineType: n1-standard-8
sourceImage: projects/bazel-public/global/images/bazel-with-worker-0.6.0
sourceImageProject: bazel-public
env:
- key: 'BAZEL_REMOTE_CACHE'
value: 'grpc://remote-cache.example.com:9092'
- key: 'BAZEL_REMOTE_EXECUTOR'
value: 'grpc://remote-executor.example.com:9092'
Plain Text
복사
3.
프로젝트 루트 디렉토리에 .bazelrc 파일 생성:
# 원격 실행 설정
build:remote --remote_executor=grpc://<원격 실행 서버 주소>
build:remote --jobs=<원하는 동시 작업 수>
build:remote --remote_timeout=<원격 작업 제한 시간(초)>
test:remote --remote_executor=grpc://<원격 실행 서버 주소>
test:remote --jobs=<원하는 동시 작업 수>
test:remote --remote_timeout=<원격 작업 제한 시간(초)>
# 원격 캐시 설정
build:remote --remote_cache=grpc://<원격 캐시 서버 주소>
test:remote --remote_cache=grpc://<원격 캐시 서버 주소>
Shell
복사
4.
Bazel 명령어 실행:
$ bazel build --config=remote //...
$ bazel test --config=remote //...
Shell
복사
이 예제를 참고하여 개발자는 Google Cloud Build와 함께 원격 실행을 사용하여 빌드 및 테스트를 수행할 수 있습니다. 원격 실행을 사용하면 더 빠른 빌드 및 테스트 속도와 확장 가능성을 얻을 수 있습니다. 또한, 여러 개발자가 동일한 빌드 결과를 얻어 협업을 향상시킬 수 있습니다.
원격 실행 시 주의할 점
1.
네트워크 지연: 원격 실행을 사용하면 네트워크 지연이 발생할 수 있습니다. 이로 인해 작업 전송과 결과 수신에 시간이 걸릴 수 있으며, 특히 로컬 빌드에 비해 속도 저하가 발생할 수 있습니다. 이를 해결하기 위해 높은 대역폭과 낮은 지연 시간을 가진 네트워크를 사용하거나 원격 실행 서버와 가능한 한 가까운 위치에 있어야 합니다.
2.
원격 서버의 비용: 원격 실행을 사용하면 원격 서버 또는 클러스터를 이용해야 하므로 추가 비용이 발생할 수 있습니다. 필요에 따라 자원을 확장하고 축소할 수 있는 클라우드 기반 서비스를 사용하면 비용을 최적화할 수 있습니다.
3.
보안 및 데이터 프라이버시: 원격 실행을 사용하면 소스 코드, 종속성 및 빌드 결과를 원격 서버에 전송하게 됩니다. 이로 인해 기밀 데이터 노출의 위험이 있으므로, 암호화 및 인증을 포함한 적절한 보안 조치를 적용해야 합니다.
4.
설정 복잡성: 원격 실행 환경을 설정하고 유지하는 것은 로컬 빌드 환경에 비해 복잡할 수 있습니다. 서버 및 클라이언트 측 구성, 인증 및 네트워크 설정을 정확하게 설정해야 원격 실행이 원활하게 작동합니다.
5.
실행 환경 호환성: 로컬 환경과 원격 환경 간의 차이로 인해 실행 환경에 호환성 문제가 발생할 수 있습니다. 이 문제를 해결하려면 도커 컨테이너와 같은 도구를 사용하여 개발 및 빌드 환경을 표준화하는 것이 좋습니다.
6.
재사용 가능한 빌드 작업 작성: 원격 실행의 효과를 극대화하려면 재사용 가능한 빌드 작업을 작성해야 합니다. Bazel은 hermetic(격리된) 빌드를 장려하지만, 빌드 및 테스트 규칙이 외부 요소에 의존하거나, 환경 변수에 의존하거나, 시스템에 설치된 도구를 사용하는 경우 원격 실행에서 제대로 작동하지 않을 수 있습니다.
원격 실행 시 고려 사항
a. Hermeticity: 빌드 작업이 외부 요소에 의존하지 않고 모든 입력이 명시적으로 선언되어 있는지 확인하세요. 이를 통해 빌드 작업이 일관성 있게 실행되고 원격 실행 환경에서도 문제가 발생하지 않도록 합니다.
b. 상대 경로 사용: 빌드 작업에서 절대 경로를 사용하는 것은 원격 실행 환경에서 문제를 일으킬 수 있습니다. 따라서 상대 경로를 사용하여 빌드 규칙을 작성하고, 빌드 결과물이 원격 환경에서도 제대로 생성되도록 합니다.
c. 환경 변수 제한: 빌드 작업이 필요한 경우에만 환경 변수를 사용하고, 가능한 한 빌드 파일에서 선언하세요. 이렇게 하면 빌드 작업이 원격 환경에서도 예상대로 실행되며, 다른 개발자가 동일한 결과를 얻을 수 있습니다.
d. 실행 플랫폼 지정: 로컬 환경과 원격 환경 간의 호환성 문제를 피하려면 실행 플랫폼을 명시적으로 지정하는 것이 좋습니다. Bazel은 실행 플랫폼을 정의할 수 있는 platform 규칙을 제공하며, 이를 사용하여 원격 실행 환경에서 필요한 특정 도구 및 라이브러리를 지정할 수 있습니다.
e. 테스트 격리: 원격 실행에서 테스트를 실행할 때 테스트 간에 상태 공유가 발생하지 않도록 격리를 고려하세요. 이렇게 하면 테스트가 원격 환경에서도 예상대로 실행되며, 동시 실행에서도 문제가 발생하지 않습니다.
원격 실행 클러스터 구성하기
원격 실행을 통한 클러스터 환경에서 빌드 구조를 설계하고 구현하려면 여러 단계를 거쳐야 합니다. 이 예제에서는 Kubernetes를 사용하여 클러스터 환경을 설정하고, Bazel 원격 실행을 사용하여 빌드 작업을 분산시키는 방법을 설명합니다.
1.
Kubernetes 클러스터 설정:
먼저, Kubernetes 클러스터를 설정하고 관리하는 데 필요한 도구를 설치해야 합니다. 예를 들어, Google Kubernetes Engine(GKE)을 사용할 수 있습니다.
a. Google Cloud SDK 설치 및 구성:
$ curl https://sdk.cloud.google.com | bash
$ exec -l $SHELL$ gcloud init
Plain Text
복사
b. Kubernetes 클러스터 생성:
$ gcloud container clusters create my-cluster --zone=<원하는 존> --num-nodes=<노드 수>
Plain Text
복사
c. Kubernetes 컨텍스트 설정:
$ gcloud container clusters get-credentials my-cluster --zone=<원하는 존>
Plain Text
복사
d. kubectl 설치:
$ gcloud components install kubectl
Plain Text
복사
2.
Bazel 원격 실행 클러스터에 필요한 컴포넌트 배포:
이 예제에서는 Buildbarn을 사용하여 원격 실행 및 캐시 서버를 배포합니다. Buildbarn은 Bazel 원격 실행 API를 구현하는 고성능 원격 실행 서비스입니다.
a. Buildbarn 배포 리포지토리 클론:
$ git clone https://github.com/buildbarn/bb-deployments.git
$ cd bb-deployments
Plain Text
복사
b. Buildbarn 배포를 위한 Kubernetes 리소스 생성:
$ kubectl create namespace buildbarn
$ kubectl apply -n buildbarn -f kubernetes/configmap.yaml
$ kubectl apply -n buildbarn -f kubernetes/storage.yaml
$ kubectl apply -n buildbarn -f kubernetes/scheduler.yaml
$ kubectl apply -n buildbarn -f kubernetes/worker.yaml
Plain Text
복사
c. Buildbarn 서비스 및 원격 캐시 주소 확인:
$ kubectl -n buildbarn get svc
Plain Text
복사
3.
프로젝트 루트 디렉토리에 .bazelrc 파일 생성:
이전에 얻은 Buildbarn 서비스 및 원격 캐시 주소를 사용하여 .bazelrc 파일을 구성합니다.
# 원격 실행 설정
build:remote --remote_executor=grpc://<Buildbarn 원격 실행 서버 주소>
build:remote --jobs=<원하는 동시 작업 수>
build:remote --remote_timeout=<원격 작업 제한 시간(초)>
test:remote --remote_executor=grpc://<Buildbarn 원격 실행 서버주소>
test:remote --jobs=<원하는 동시 작업 수>
test:remote --remote_timeout=<원격 작업 제한 시간(초)>
Plain Text
복사
원격 캐시 구성
원격 캐시를 사용하면 동일한 작업에 대해 반복적인 빌드 시간을 줄일 수 있으며, 빌드 결과의 일관성을 향상시킬 수 있습니다.
1.
원격 캐시 서버 설정:
원격 캐시를 사용하려면 먼저 원격 캐시 서버를 설정해야 합니다. Bazel은 원격 캐시를 위한 gRPC 또는 HTTP 프로토콜을 지원합니다. 여기에서는 Buildbarn 캐시 서버를 예로 들겠습니다.
a. Buildbarn 배포 리포지토리 클론:
$ git clone https://github.com/buildbarn/bb-deployments.git
$ cd bb-deployments
Plain Text
복사
b. Buildbarn 캐시 서버를 위한 Kubernetes 리소스 생성:
$ kubectl create namespace buildbarn
$ kubectl apply -n buildbarn -f kubernetes/configmap.yaml
$ kubectl apply -n buildbarn -f kubernetes/storage.yaml
$ kubectl apply -n buildbarn -f kubernetes/cache.yaml
Plain Text
복사
c. Buildbarn 캐시 서비스 주소 확인:
$ kubectl -n buildbarn get svc
Plain Text
복사
2.
프로젝트 루트 디렉토리에 .bazelrc 파일 생성:
이전에 얻은 Buildbarn 원격 캐시 서버 주소를 사용하여 .bazelrc 파일을 구성합니다.
# 원격 캐시 설정
build:remote --remote_cache=grpc://<Buildbarn 원격 캐시 서버 주소>
test:remote --remote_cache=grpc://<Buildbarn 원격 캐시 서버 주소>
Plain Text
복사
3.
Bazel 명령어 실행:
이제 원격 캐시 설정이 완료되었습니다. Bazel 명령어를 실행하여 원격 캐시를 사용하여 빌드 작업을 수행할 수 있습니다.
$ bazel build --config=remote //...
$ bazel test --config=remote //...
Plain Text
복사
원격 캐시를 사용하면 이전에 빌드된 결과를 원격 저장소에서 가져와 빌드 및 테스트 시간을 크게 줄일 수 있습니다. 또한, 여러 개발자가 동일한 빌드 결과를 얻어 협업을 향상시킬 수 있습니다.
원격 캐시를 사용할 때 다음과 같은 몇 가지 주의 사항을 고려해야 합니다:
1.
Hermeticity: 원격 캐시를 사용하려면 빌드 작업이 hermetic 해야 합니다. 이는 모든 입력이 명시적으로 선언되어 있고 외부 요소에 의존하지 않는 것을 의미합니다. 이를 통해 빌드 작업이 일관성 있게 실행되고 원격 캐시에서도 문제가 발생하지 않습니다.
2.
캐시 키 관리: 원격 캐시에서 사용하는 캐시 키는 빌드 작업의 입력에 기반합니다. 이는 동일한 입력에 대해 동일한 캐시 키를 생성합니다. 따라서 입력이 변경되지 않으면 캐시 키도 변경되지 않으므로 원격 캐시에서 결과를 재사용할 수 있습니다.
3.
캐시 크기 및 정책: 원격 캐시의 크기와 정책에 대해 고려해야 합니다. 캐시 크기가 너무 작으면 캐시 효율성이 저하될 수 있으며, 너무 크면 저장 공간의 낭비가 발생할 수 있습니다. 적절한 정책을 선택하여 오래된 또는 사용되지 않는 캐시 항목을 정리하는 것이 좋습니다.
4.
보안: 원격 캐시에 민감한 데이터가 포함될 수 있으므로, 캐시 서버와 통신할 때 적절한 보안 조치를 취해야 합니다. 예를 들어, TLS를 사용하여 데이터를 암호화하고 인증을 수행할 수 있습니다.
5.
캐시 효과를 최대화하기 위한 Bazel 설정: Bazel에서 캐시 효과를 최대화하려면 플래그를 통해 캐시 가능한 작업을 최대화해야 합니다. 예를 들어, -incompatible_strict_action_env 플래그를 사용하여 환경 변수를 고정할 수 있습니다.
원격 캐시를 사용하면 빌드 및 테스트 작업의 속도를 크게 향상시킬 수 있습니다.