CI 파이프라인을 위한 git clone/fetch 전략 최적화

4278 단어 cipipelinegit
지난 주에 저는 온프레미스 Jenkins 파이프라인에서 클라우드 기반 솔루션으로 Frontend Monorepo을 마이그레이션하기 위해 열심히 노력했습니다.

내가 극복해야 하는 큰 장애물 중 하나는 우리의 모노레포(monorepo)의 엄청난 규모를 처리하는 것이었습니다. 전체 기록(원격의 모든 분기, 모든 태그, 전체 기록)을 포함하면 저장소 크기가 1GB 이상입니다.

실행할 때마다 많은 데이터를 다운로드하는 것은 대역폭과 시간 낭비이므로 git 문서를 살펴보고 여러분과 공유할 몇 가지 가능성을 찾았습니다.

단일 브랜치를 체크아웃/구축하기만 하면 됩니다.



자식 클론 --단일 분기



이 간단한 플래그( --single-branch )는 메인 브랜치의 기록만 가져오도록 합니다. 리모컨에 더 많은 활성 지점이 있을수록 더 큰 이점이 있으며 리포지토리에 400명 이상의 활성 기여자가 있으므로 도움이 됩니다!

자식 가져오기 --태그 없음



또 다른 간단한 플래그! 이것은 git 기록에서 태그를 생략합니다. 태그는 종종 <package-name>@1.2.67 와 같은 버전 번호입니다. 엄청난 데이터 세이버는 아니지만 도움이 됩니다. 그러나 일부 CI 파이프라인에는 태그가 필요하므로 필요한 경우 다시 확인하십시오.

자식 가져오기 --깊이=<n>



예, 지금 우리는 이야기하고 있습니다. 이 플래그는 기록을 최신 커밋으로 제한합니다. 특정 분기의 최신 상태에만 관심이 있는 경우에 정말 유용합니다. 예를 들어 기능 브랜치(또는 메인 브랜치)를 구축해야 한다는 것을 알고 있고 모든 기록이 필요하지 않은 경우! 엄청난 데이터 절약 가능성 🤤.

참고: 깊이가 상당히 크면 서버에서 전송 시간을 늘리기 위해 많은 계산을 수행해야 합니다. 50000의 깊이는 시간을 300% 증가시켰습니다. 90%의 깊이1 절단 시간.

git fetch --depth=1 출처 <full_SHA1>



해당 분기의 모든 기록을 가져오지 않고 분기 끝에 있지 않은 단일 커밋이 필요할 때 사용합니다. 참조this StackOverflow question for details

플래그 결합 git clone --no-tags --single-branch --depth=1



단일 분기의 최신 상태가 필요한 경우 이것이 명령입니다! 메인이 아닌 브랜치를 빌드하는 경우 --branch=<branch-name>를 추가하여 특정 브랜치를 체크아웃하도록 이 명령을 수정할 수도 있습니다.

하나 이상의 분기가 필요합니다(전부는 아님)



여기서 상황이 조금 더 까다로워집니다. 이 시나리오git clone에서는 모든 분기 또는 하나의 분기만 복제할 수 있기 때문에 최선의 선택이 아닐 수 있습니다.

이것은 또한 기능 분기가 메인 분기의 분기를 시작하는 단일 "상위"커밋을 결정해야 했기 때문에 가장 까다로운 시나리오였습니다.

자식 클론 --깊이=<n>



이 명령은 기록이 제한된 모든 활성 분기를 가져옵니다. 두 개(또는 그 이상의 분기)의 가장 최근 상태에 관심이 있는 경우 이 방법이 유용할 수 있습니다.

이 명령의 단점은 여전히 ​​모든 분기를 가져오고 "상위"커밋을 결정하는 것이 어렵거나 불가능하다는 것입니다(깊이에 따라 다르지만 여전히 부정확할 수 있음).

사용자 지정 자식 구성



이것은 무서운 것처럼 보일 수 있지만 실제로는 매우 효과적일 수 있습니다. 태그를 원하고 기록의 깊이를 제어하려는 경우 추적하려는 분기 수를 완전히 제어할 수 있습니다.

단계


  • 다음을 실행하여 빈 git 저장소를 초기화합니다. git init
  • .git/config 파일에 다음 스니펫을 추가합니다.

    # .git/config
    [core]
            repositoryformatversion = 0
            filemode = true
            bare = false
            logallrefupdates = true
    [remote \"origin\"]
            # replace with your own repo!
         url = [email protected]:patricksevat/foo.git
    
            # list the branches that you want to track
         fetch = +refs/heads/main:refs/remotes/origin/main
            fetch = +refs/heads/development:refs/remotes/origin/development
            fetch = +refs/heads/feature:refs/remotes/origin/feature
    
    # Replace main with master or whatever your main branch name is
    [branch \"main\"]
            remote = origin
            merge = refs/heads/main
    

  • 이제 원하는 플래그로 git fetch 할 수 있습니다.
    나열된 분기의 전체 기록에 대한 플래그를 추가하거나 기록을 제한하기 위해 --no-tags 또는 --depth=1를 사용하지 마십시오.
  • 가져온 브랜치 중 하나로 git checkout 실행하는 것을 잊지 마십시오. 그렇지 않으면 빈 작업 디렉토리가 생깁니다!

  • 결론



    이 명령이 git CI 전략을 최적화하는 데 도움이 되기를 바랍니다. 유용한 팁이나 개선 사항이 있으면 댓글에 남겨주세요!

    좋은 웹페이지 즐겨찾기