TOOL/CI 2019. 12. 25. 23:40

GitLab-CI (깃랩씨아이)

꿀Tip - 의존성 라이브러리 파일들을 자동으로 캐시하기 (Cache Gradle-Dependencies-Cache with GItLab-CI Automatically)

꾸역꾸역 구현했던 CI Script중에서 일부를 간단하게 편집하여 공유한다..

조금 비효율적이거나 잘못된 부분이 있을지는 모르겠지만 누군가에게는 도움이 되시길..

Gradle Cache와 GitLab-CI Cache로 매번 의존성파일 다운로드를 하는 짓을 막아보자.

Docker Executor를 사용하여 Project를 빌드할 때, 매번 Dependencies를 다운로드 하게 될 지 모른다.
물론 자동으로 돌아가는 CI환경이겠지만 시간과 자원을 낭비하는 일임에는 분명하다.

다행히도 Gradle은 한번 Download한 의존성파일을 어딘가에 Cache한다.

Docker Container는 일회용으로 쓰이고 버려지기 때문에 Cache하는 의미가 없을 수 있다.

하지만 다행히도 이를 Cache할 수 있도록 GitLab-CI에 기능이 존재한다.

이렇게 되면 한번 다운로드한 의존성파일들을 매CI마다 새로운 Docker Container에서 작업수행 하면서도 또 다시 다운로드할 필요가 없어진다. :o

.gitlab-ci.yml파일에 Build가 필요한 Statge에서 cache속성을 정의해보자.

  • cache속성 예

      cache: 
          key: whenever-with-dependencies
          paths:
              - .gradle/wrapper
              - .gradle/caches
  • key는 적당히 이름을 지어서 적어주자

  • paths에는 cache가 필요한 경로를 적어주자 (Stage를 성공적으로 마칠 때 자동으로 cache해 줬다가 다음에 /cache 폴더에 불러준다.)

  • 다음은 예시이다.

      build-app:
    
          ##################################################
          # SETUP
          ##################################################
          stage: build
          retry: 2
          tags: # gitlab-runner의 Tag (Git의 Tag와 무관하다.)
              - your-docker-ci-tag
          image: centos-jdk:test
          only: # CI가 작동할 유효한 Branch
              - master
              - develop 
              - /^.*ci-test.*$/
          cache: # 명시된 경로는 해당Stage가 종료될 때 Cache되며 다음에 실행될 때 마지막 Cache된 데이터를 `/Cache` 경로에 불러준다.
              key: whenever-with-dependencies
              paths:
                  - .gradle/wrapper
                  - .gradle/caches
          artifacts: 
              paths:
                  - /builds/some_project/some_module/build/libs/*.war
              expire_in: 1 week
    
          ##################################################
          # SCRIPT - Check Environment
          ##################################################
          before_script:
              - echo '########## - Define my variables'
              - export GRADLE_USER_HOME=`pwd`/.gradle
              - echo $GRADLE_USER_HOME
    
              - echo '########## - Check Current Path'
              - pwd
              - ls -a ./
    
              - echo '########## - Check cached data files'
              - ls -a "$GRADLE_USER_HOME" || true
              - ls -a /cache || true
              - ls -a /cache/caches || true
    
          ##################################################
          # SCRIPT - Build
          ##################################################
          script:
              - echo "################################################## - Load cached data to ${GRADLE_USER_HOME}"
              - mkdir $GRADLE_USER_HOME
              #Cache된 것이 없어서 Copy Error발생해도 무시
              - cp -r /cache/wrapper /cache/caches $GRADLE_USER_HOME || true   
              #작업환경이 Windows였는데 CI환경은 Unix시스템일 경우 Unix접근권한의 부재가 생긴다. 이를 방지한다. 
              #또는 사전에 이 명령을 조치하면 script에서 신경 쓸 필요가 없어진다.
              #==>  git update-index --chmod=+x ./gradlew.sh
              - chmod +x gradlew  
              #-g 옵션으로 Cache된 파일이 있는 Path를 알려주자
              - ./gradlew clean build -g $GRADLE_USER_HOME
    
          ##################################################
          # SCRIPT - Checking
          ##################################################
          after_script:
              - echo '########## - Check cached files'
              - ls -a "$GRADLE_USER_HOME" || true
              - echo '########## - Check Artifacts files'
              - ls -al ./build/libs/*
              - echo '########## - Finish Check'
              - echo 'OK ^^'

참고