개발자 블로그

Azure DevOps Pipeline - 5. git 체크아웃 속도 개선 본문

프로그래밍/DevOps

Azure DevOps Pipeline - 5. git 체크아웃 속도 개선

로이드.Roid 2022. 8. 30. 22:01

왜 느림?

  • 왜 이렇게 많은 시간이 걸리는지 확인하기 위해 파이프라인 실행 결과를 살펴보겠습니다.

  • 제목이 스포일러가 된 것 같은데.. 소스코드 체크아웃 하는 부분이 8분 31초나 걸리고 있습니다.
  • 전체 런닝 타임이 12분 30초인걸 감안하면 거의 60% 정도의 시간이 여기에 소요된다는 것을 알 수 있습니다.
  • 체크아웃 항목을 클릭하면 자세한 내용을 볼 수 있습니다. 
  • 주요 내용을 옮기면 대략 아래와 같습니다.
Receiving objects:  98% (28461/29041), 2.71 GiB | 5.79 MiB/s
Receiving objects:  99% (28751/29041), 2.71 GiB | 5.79 MiB/s
Receiving objects: 100% (29041/29041), 2.71 GiB | 6.08 MiB/s
Receiving objects: 100% (29041/29041), 2.71 GiB | 5.62 MiB/s, done.

...

* [new branch]	target26		-> origin/target26
* [new branch]	target29		-> origin/target29
* [new tag]		4.1.6-version	-> 4.1.6-version
* [new tag]		4.1.7-version	-> 4.1.7-version
  • 네.. 그렇습니다. 모든 브랜치와 모든 태그.. Repository 전체를 통으로 다 받아오고 있습니다.
  • 2.71GB나 되는 repo를 모두 가져오고 있으니 느릴 수 밖에 없습니다.
  • 우리는 repo의 모든 내용이 필요한게 아닙니다.
  • target branch의 최종 코드 형상만 있으면 됩니다.
  • 우리에게 필요한 코드만 내려받도록 스크립트를 수정해보겠습니다.

 

git checkout 스크립트 추가

  • 처음 파이프라인을 구축할 때 YAML로 해야 된다고 했던 것을 기억하시나요?
  • YAML로 구축했다면 스크립트를 수정해서 체크아웃 속도를 개선 할 수 있습니다.
  • 다시 파이프라인 스크립트를 보겠습니다.
trigger:
- azure-pipelines

pool:
  vmImage: 'macos-latest'
  
steps:
- task: Gradle@2
  inputs:
    workingDirectory: ''
    gradleWrapperFile: 'gradlew'
    gradleOptions: '-Xmx3072m -Dorg.gradle.java.home=$(JAVA_HOME_11_X64)'
    publishJUnitResults: false
    testResultsFiles: '**/TEST-*.xml'
    tasks: 'assembleMarketRelease appDistributionUploadMarketRelease'
  • 스크립트에는 소스코드를 체크아웃하는 로직이 보이지 않습니다.
  • 네, 이건 자동으로 생성되는 것 같네요.
  • 근데 디폴트로 생성되는 코드가 전체 repo를 다 내려받도록 되어있다니.. 이건 좀..😢
  • 이제 체크아웃 스크립트를 추가해 보겠습니다.
  • 절차는 아래와 같습니다.
    1. checkout step을 무시(?)하는 스크립트 추가
    2. git checkout script 추가
    3. variables 추가
  • 우선 1, 2번에 대해서 작업 완료 한 스크립트는 아래와 같습니다.
trigger:
- azure-pipelines

pool:
  vmImage: 'macos-latest'
  
steps:
- checkout: none

- task: CmdLine@2
  inputs:
    script: |
      echo git init $(Build.SourcesDirectory)
      git init $(Build.SourcesDirectory)
      echo git remote add origin https://$(REPOSITORY)
      git remote add origin https://$(ACCESS)@$(REPOSITORY)
      git config gc.auto 0
      git config --get-all http.https://$(ACCESS)@$(REPOSITORY).extraheader
      git config --get-all http.proxy
      git config http.version HTTP/1.1
      echo git fetch --progress --verbose --depth=1 origin azure-pipelines
      git -c http.extraheader="AUTHORIZATION: bearer $(System.AccessToken)" fetch --force --progress --verbose --depth=1 origin azure-pipelines
      git checkout --progress --force azure-pipelines
  displayName: 'Checkout AppName@azure-pipelines'
  
  ...
  • 1번에 해당되는 스크립트가 7~8 라인입니다.
  • 2번에 해당되는 스크립트는 그 밑에 있는 CmdLine@2 task입니다.
    • 여러 git 명령어들이 사용되었는데, 자세한 내용은 아래 링크를 참고하시기 바랍니다.
      (아 뭐 물론 저는 길어서 읽어보지는 않았...;; 😛)
✔ git - Documentation

https://git-scm.com/doc
  • 그냥 위 스크립트를 무지성 copy & paste 하셔도 됩니다.
  • 다만 "azure-pipelines"만 체크아웃 할 브랜치명으로 바꿔서 작성해주시면 됩니다.
  • 참고로 "displayName"은 옵션 항목입니다. 지정해주면 파이프라인 각 단계가 실행 될 때 해당 값으로 표시가 됩니다.
  • 스크립트 작성이 끝났으면, 스크립트에서 사용하는 변수들을 Variables에 입력해줘야 합니다.

 

Variables 추가

  • 위 스크립트에서 사용한 아래 2개의 변수를 추가해줍니다.
    • ACCESS
    • REPOSITORY
  • 변수 값은 Repos에서 Clone 버튼을 누르면 쉽게 확인이 가능합니다.
    • 이 예제에서 사용한 repo url은 아래와 같습니다.
    • https://team_name@dev.azure.com/team_name/app_name/_git/app_name
    • 여기서 ACCESS는 빨간색으로 표기한 "team_name", REPOSITORY는 초록색으로 표기한 "dev.azure.com/team_name/app_name/_git/app_name"이 됩니다.
  • 변수 추가가 완료 되었습니다.

  • "Save" 버튼을 눌러서 모든 변경사항을 저장합니다.
  • azure-pipelines.yml 파일이 업데이트 되면서 자동으로 파이프라인이 트리거 됩니다.

 

얼마나 빨라졌을까?

  • 실행 결과를 확인해 보겠습니다.

체크아웃 9초컷 실화냐...

  • 튜닝 전, 후 비교표입니다.
  튜닝 전 튜닝 후
파일 사이즈 2.71GB 34.77MB
다운로드 시간 8분 31초 9초

  • 이제야 쓸만한 빌드 파이프라인이 구축 된 것 같네요.

 

Comments