63 lines
3.5 KiB
YAML
63 lines
3.5 KiB
YAML
# 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 only if the $ENABLE_SHALLOW_REPO_CACHING variable exists
|
|
# The `git repack` call works around a Git bug with shallow clones: https://gitlab.com/gitlab-org/git/-/issues/86
|
|
- if [ -n "$ENABLE_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
|
|
# By default, we want to cache the full repo, unless the $DISABLE_FULL_REPO_CACHING variable exists (in the case the shallow clone caching is working well)
|
|
- if [ -z "$DISABLE_FULL_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
|