개발자 블로그
Azure DevOps Pipeline - 7. gradle 빌드 속도 개선 본문
반응형
⛔️ 사전 알림 ⛔️ 이 글은 실패한 글 입니다. 시간이 아까우신 분들은 뒤로가기를 눌러주세요. |
파이프라인 성능 개선
- 테스트 자동화까지 구현을 했지만, 덕분에 전체 빌드 파이프라인 수행 시간이 많이 늘어났습니다.
- 아래는 각 스텝 별 실행 시간입니다.
- 안드로이드 이미지를 다운로드 받고, 에뮬레이터가 부팅이 완료 될 때 까지 걸리는 시간이 3분 55초입니다. 하지만 이 스크립트에는 개선의 여지가 없습니다.
- 그 다음 많은 시간을 잡아먹는 것은 Gradle 빌드 작업입니다.
- 아무래도 이 Gradle 작업의 성능을 개선해서 전체 파이프라인의 속도를 개선해야 될 것 같네요.
Gradle 성능 개선
- 사실 gradle은 그렇게 간단하지 않습니다. gradle만 다루는 책이 별도로 출판 되었을 정도니깐요.
- 저도 솔직히 말씀드려서 gradle에 대해 깊게 알지는 못합니다. 하지만 간단하게 적용할 수 있는 몇 가지 튜닝 방법들을 적용해보겠습니다.
1. 옵션 추가
- 튜닝하면 떠오르는 바로 그것! 캐싱과 병렬 실행
- 이 두 가지를 위한 옵션이 있습니다.
- 바로 YAML 스크립트를 수정한 뒤 파이프라인을 돌려보도록 하겠습니다.
- 수정 된 스크립트는 아래와 같습니다.
-
- task: Gradle@2 inputs: workingDirectory: '' gradleWrapperFile: 'gradlew' gradleOptions: '-Xmx3072m -Dorg.gradle.java.home=$(JAVA_HOME_11_X64)' options: '--build-cache --parallel' publishJUnitResults: true testResultsFiles: '**/TEST-*.xml' tasks: 'testMarketReleaseUnitTest connectedMarketDebugAndroidTest assembleMarketRelease appDistributionUploadMarketRelease'
- 53라인에 캐시 사용과 병렬 실행을 위한 "--build-cache", "-parallel" 옵션을 추가했습니다.
-
- 실행 결과는 아래와 같습니다.
- 예상했던 것과 너무나도 다른 결과입니다. Gradle 실행 시간이 무려 4분 가까이 증가했습니다.
- 하지만 바로 위에 있는 "Install Android Emulator" task 수행 시간도 2분 가까이 증가한 걸 보면 아마 다른 파이프라인 작업들로 인해서 가상머신에 로드가 많이 걸렸던게 아닌가 싶습니다. (뇌피셜입니다.)
- 다시 한 번 돌려보겠습니다.
- 이번에는 시간이 줄어들었네요. 하지만 "Install Android Emulator" 시간까지 줄어들은 걸 보면 순수하게 옵션 추가 덕분에 개선되었다고 보기는 조금 어려울 것 같습니다.
- 실제로 여러번 돌려 본 결과 옵션을 추가히기 전과 후의 시간 차이가 전에 git 체크아웃 속도 개선 작업을 했을 때 만큼 드라마틱한 차이는 없었습니다.
2. 램 늘리기
- 예로부터 "다다익램"이라는 말이 있습니다.
- 이번에는 gradle option의 램 사이즈를 늘려보도록 하겠습니다.
- 디폴트로 잡힌 램 사이즈는 3GB입니다. 2의 제곱수가 아니라서 안정적인 느낌이 안드네요. 4GB로 늘려보겠습니다.
- 수정 된 스크립트는 아래와 같습니다.
-
- task: Gradle@2 inputs: workingDirectory: '' gradleWrapperFile: 'gradlew' gradleOptions: '-Xmx4096m -Dorg.gradle.java.home=$(JAVA_HOME_11_X64)' options: '--build-cache --parallel' publishJUnitResults: true testResultsFiles: '**/TEST-*.xml' tasks: 'testMarketReleaseUnitTest connectedMarketDebugAndroidTest assembleMarketRelease appDistributionUploadMarketRelease'
- "gradleOptions" 항목에 기존 "-Xmx3072"로 되어있던 값을 "-Xmx4096"으로 변경해주었습니다.
-
- 실행 결과는 아래와 같습니다.
- 네.. 이번에도 별 효과는 없네요..😢
- 그렇다면 마지막 방법 gradle 버전을 업데이트 해보겠습니다.
3. gradle 최신 버전으로 업데이트
- gradle 버전 업데이트를 한다고 해서 빨라지냐? 라고 생각하실지도 모르겠습니다.
- 하지만 이 방법은 무려 gradle 공식 웹사이트에서 가장 처음으로 소개하고 있는 성능 개선 방법입니다.
- gradle 버전은 안드로이드 프로젝트에서 update 해줘야 됩니다.
- 이 프로젝트는 현재 gradle 7.0.2 버전을 사용하고 있는데, 최신버전인 7.2 버전을 사용하도록 프로젝트를 수정했습니다.
- 자, 이제 다시 빌드 파이프라인을 실행시켜 봅시다.
- 아니 이거 뭐 운빨 ㅈ망게임도 아니고 어떻게 돌릴 때 마다 실행 시간이 다 다르냐.. 무슨 가챠 뽑기임?
- GG..
진짜 방법이 없는걸까?
- 위에서 잠깐 소개했던 gradle 공식 웹사이트에는 여기서 다룬 방법 외에 다양한 성능 개선 방법을 소개하고 있습니다.
- 자세한 내용은 아래 링크를 참고하세요.
- 그리고 안드로이드에 한정한다면, 몇 가지 추가적으로 할 수 있는 방법들이 있습니다.
- 자세한 내용은 아래 링크를 참고하세요.
- 그리고 제가 제안하는 한가지 방법은 "테스트 자동화"를 빼는 것 입니다.
- 아니 기껏 만들어놓고 이제와서 다시 뺀다고?
- 네니요.. 아주 뺀다는 것은 아니고, 각각의 목적에 맞게 파이프라인을 여러개 구성하자는 것 입니다.
(음..?)
- 제가 구성한 파이프라인을 예시로 들면,
- deploy
- quick_deploy
- 이렇게 두 개의 배포를 위한 브랜치를 만들었고, 각각의 브랜치를 트리거로 해서 파이프라인(YAML 파일)을 만들었습니다.
- 그래서
- "테스트 자동화" 코드들이 들어간 스크립트는 "deploy" 브랜치에 적용하고
- "테스트 자동화" 없이 바로 gradle 작업을 수행하는 스크립트는 "quick_deploy"
- 에 적용했습니다.
- 이제
- 유닛 테스트를 돌려 본 다음에 배포할 때는 "deploy" 브랜치에 머지를 하고
- 유닛 테스트 없이 즉각적으로 배포하고자 할 때는 "quick_deploy" 브랜치에 머지
- 를 하는 방법으로 좀 더 효율적으로 파이프라인을 돌릴 수 있습니다.
- 이렇게 되면
- deploy: 13분 내외
- quick_deploy: 5분 내외
- 의 시간으로 파이프라인 실행이 완료 됩니다.
- 이정도면 나름 괜찮은 방법 아닌가요?
반응형
'프로그래밍 > DevOps' 카테고리의 다른 글
Azure DevOps Pipeline - 8. AWS CodeArtifact 연동 (0) | 2025.07.01 |
---|---|
Azure DevOps Pipeline - 6. 테스트 자동화 (2) | 2025.06.30 |
Azure DevOps Pipeline - 5. git 체크아웃 속도 개선 (0) | 2022.08.30 |
Azure DevOps Pipeline - 4. 배포 자동화 (0) | 2022.08.24 |
Azure DevOps Pipeline - 3. YAML로 만들기 (0) | 2022.07.31 |
Comments