TOOL/CI
[.gitlab-ci.yml] Gradle Cache와 GitLab-CI Cache로 매번 의존성파일 다운로드를 하는 짓을 막아보자.
forgiveall
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 ^^'
참고
- How to cache Gradle dependencies inside Gitlab CI: https://stackoverflow.com/questions/44757450/how-to-cache-gradle-dependencies-inside-gitlab-ci
- Caching directories inside $HOME: https://gitlab.com/gitlab-org/gitlab-runner/issues/327
- Gradle caching doesn't work with GitLab-CI: https://stackoverflow.com/questions/52544210/gradle-caching-doesnt-work-with-gitlab-ci
- Gitlab CI gradle dependency cache: https://stackoverflow.com/questions/34162120/gitlab-ci-gradle-dependency-cache
- Update Gradle.gitlab-ci.yml to use
gradle:alpine
: https://gitlab.com/gitlab-org/gitlab-ci-yml/blob/f160404abed92c260106396a9739e3bb74e07c95/Gradle.gitlab-ci.yml - How the gitlab-ci cache is working on docker runner? what is /cache directory? what is cache_dir?: https://stackoverflow.com/questions/54855472/how-the-gitlab-ci-cache-is-working-on-docker-runner-what-is-cache-directory-w
- Cache unstable between stages: https://gitlab.com/gitlab-org/gitlab-ce/issues/59101