# Builds a cached .tar.gz of the $CI_DEFAULT_BRANCH branch with full history and # uploads it to Google Cloud Storage. This archive is downloaded by a # script defined by a CI/CD variable named CI_PRE_CLONE_SCRIPT. This has # two benefits: # # 1. It speeds up builds. A 800 MB download only takes seconds. # 2. It significantly reduces load on the file server. Smaller deltas # means less time spent in git pack-objects. # # Since the destination directory of the archive depends on the project # ID, this is only run on GitLab.com. # # CI_REPO_CACHE_CREDENTIALS contains the Google Cloud service account # JSON for uploading to the gitlab-ci-git-repo-cache bucket. These # credentials are stored in the Production vault. # # Note that this bucket should be located in the same continent as the # runner, or network egress charges will apply: # https://cloud.google.com/storage/pricing cache-repo: extends: .cache-repo:rules image: gcr.io/google.com/cloudsdktool/cloud-sdk:alpine stage: sync variables: GIT_STRATEGY: none SHALLOW_CLONE_TAR_FILENAME: gitlab-master-shallow.tar FULL_CLONE_TAR_FILENAME: gitlab-master.tar before_script: - '[ -z "$CI_REPO_CACHE_CREDENTIALS" ] || gcloud auth activate-service-account --key-file=$CI_REPO_CACHE_CREDENTIALS' script: # Enable shallow repo caching unless the $DISABLE_SHALLOW_REPO_CACHING variable exists (in the case the shallow clone caching isn't working well) # The `git repack` call works around a Git bug with shallow clones: https://gitlab.com/gitlab-org/git/-/issues/86 - if [ -z "$DISABLE_SHALLOW_REPO_CACHING" ]; then cd .. && rm -rf $CI_PROJECT_NAME; today=$(date +%Y-%m-%d); year=$(date +%Y); last_year=`expr $year - 1`; one_year_ago=$(echo $today | sed "s/$year/$last_year/"); echo "Cloning $CI_REPOSITORY_URL into $CI_PROJECT_NAME with commits from $one_year_ago."; time git clone --progress --no-checkout --shallow-since=$one_year_ago $CI_REPOSITORY_URL $CI_PROJECT_NAME; cd $CI_PROJECT_NAME; time git repack -d; echo "Archiving $CI_PROJECT_NAME into /tmp/$SHALLOW_CLONE_TAR_FILENAME."; time git remote rm origin; time tar cf /tmp/$SHALLOW_CLONE_TAR_FILENAME .; echo "GZipping /tmp/$SHALLOW_CLONE_TAR_FILENAME."; time gzip /tmp/$SHALLOW_CLONE_TAR_FILENAME; [ -z "$CI_REPO_CACHE_CREDENTIALS" ] || (echo "Uploading /tmp/$SHALLOW_CLONE_TAR_FILENAME.gz to GCloud." && time gsutil cp /tmp/$SHALLOW_CLONE_TAR_FILENAME.gz gs://gitlab-ci-git-repo-cache/project-$CI_PROJECT_ID/$SHALLOW_CLONE_TAR_FILENAME.gz); fi # Disable the full repo caching unless the $DISABLE_SHALLOW_REPO_CACHING variable exists (in the case the shallow clone caching isn't working well) - if [ -n "$DISABLE_SHALLOW_REPO_CACHING" ]; then cd .. && rm -rf $CI_PROJECT_NAME; echo "Cloning $CI_REPOSITORY_URL into $CI_PROJECT_NAME."; time git clone --progress $CI_REPOSITORY_URL $CI_PROJECT_NAME; cd $CI_PROJECT_NAME; time git repack -d; echo "Archiving $CI_PROJECT_NAME into /tmp/$FULL_CLONE_TAR_FILENAME."; time git remote rm origin; time tar cf /tmp/$FULL_CLONE_TAR_FILENAME .; echo "GZipping /tmp/$FULL_CLONE_TAR_FILENAME."; time gzip /tmp/$FULL_CLONE_TAR_FILENAME; [ -z "$CI_REPO_CACHE_CREDENTIALS" ] || (echo "Uploading /tmp/$FULL_CLONE_TAR_FILENAME.gz to GCloud." && time gsutil cp /tmp/$FULL_CLONE_TAR_FILENAME.gz gs://gitlab-ci-git-repo-cache/project-$CI_PROJECT_ID/$FULL_CLONE_TAR_FILENAME.gz); fi