개발자 블로그

Azure DevOps Pipeline - 7. gradle 빌드 속도 개선 본문

프로그래밍/DevOps

Azure DevOps Pipeline - 7. gradle 빌드 속도 개선

로이드.Roid 2025. 7. 1. 10:26
반응형
⛔️ 사전 알림 ⛔️

이 글은 실패한 글 입니다. 시간이 아까우신 분들은 뒤로가기를 눌러주세요.

 

파이프라인 성능 개선

  • 테스트 자동화까지 구현을 했지만, 덕분에 전체 빌드 파이프라인 수행 시간이 많이 늘어났습니다.
  • 아래는 각 스텝 별 실행 시간입니다.
  • 안드로이드 이미지를 다운로드 받고, 에뮬레이터가 부팅이 완료 될 때 까지 걸리는 시간이 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분 내외
    • 의 시간으로 파이프라인 실행이 완료 됩니다.
    • 이정도면 나름 괜찮은 방법 아닌가요?

 

반응형
Comments