blob: d93afc5f629b42f12a1820a04ab23069f890a1e0 [file] [log] [blame]
#!/bin/bash
set -euo pipefail
BUILDKITE_API_TOKEN=$(gsutil cat "gs://bazel-encrypted-secrets/buildkite-api-token.enc" | \
gcloud kms decrypt --project "bazel-public" --location "global" --keyring "buildkite" --key "buildkite-api-token" --plaintext-file "-" --ciphertext-file "-")
git config --global safe.bareRepository all
echo "+++ Starting Git Mirror Update $(date)"
echo "--- Downloading existing mirrors from GCS"
rm -rf bazelbuild
gsutil cat "gs://bazel-git-mirror/bazelbuild-mirror.tar" | tar x
cd bazelbuild
function mirror() {
repo="$1"
remote_name="$(echo -n $repo | tr -C '[[:alnum:]]' '-')"
if [[ -d $remote_name ]]; then
echo "--- Updating $repo in $remote_name"
git -C "${remote_name}" fetch --prune
else
echo "+++ Cloning $repo into $remote_name"
git clone --bare "${repo}" "${remote_name}"
git -C "${remote_name}" config pack.compression 9
fi
echo "--- Repacking $remote_name"
git -C "${remote_name}" repack -a -d -F --threads=0
}
echo "--- Fetching repositories from Buildkite API"
REPOS=$(curl -sS -H "Authorization: Bearer ${BUILDKITE_API_TOKEN}" "https://api.buildkite.com/v2/organizations/bazel/pipelines?per_page=100" \
| jq '.[] | .repository' | sort -u | sed -e 's/^"//' -e 's/"$//')
echo "--- Mirroring Buildkite repositories"
for repo in $REPOS; do
mirror "$repo" &
done
wait
echo "--- Fetching repositories from bazelci.py"
REPOS_CI=$(fgrep '"git_repository": "' ../../buildkite/bazelci.py | cut -d'"' -f4 | sort -u)
echo "--- Mirroring bazelci.py repositories"
for repo in $REPOS_CI; do
mirror "$repo" &
done
wait
echo "--- Cleaning up .DS_Store files"
find . -name .DS_Store -delete
cd ..
echo "--- Verifying the Bazel mirror is up-to-date"
TEST_REPO="https://github.com/bazelbuild/bazel.git"
TEST_MIRROR="https---github-com-bazelbuild-bazel-git"
if [[ -d "bazelbuild/$TEST_MIRROR" ]]; then
REMOTE_SHA=$(git ls-remote "$TEST_REPO" HEAD | cut -f1)
LOCAL_SHA=$(git -c safe.bareRepository=all -C "bazelbuild/$TEST_MIRROR" rev-parse HEAD)
echo "Remote SHA: $REMOTE_SHA"
echo "Local SHA: $LOCAL_SHA"
if [[ "$REMOTE_SHA" == "$LOCAL_SHA" ]]; then
echo "✅ Mirror is up-to-date."
else
echo "❌ Mirror is NOT up-to-date!"
exit 1
fi
echo "--- Verifying clone with reference"
rm -rf bazel-test
git clone --reference "bazelbuild/$TEST_MIRROR" "$TEST_REPO" bazel-test
if [[ -f "bazel-test/.git/objects/info/alternates" ]]; then
echo "✅ Clone is using the mirror as a reference."
grep "bazelbuild/$TEST_MIRROR" "bazel-test/.git/objects/info/alternates"
else
echo "❌ Clone is NOT using the mirror as a reference!"
exit 1
fi
else
echo "❌ Test mirror bazelbuild/$TEST_MIRROR does not exist!"
exit 1
fi
echo "+++ Uploading Git Mirror... $(date)"
tar c bazelbuild | gsutil cp - "gs://bazel-git-mirror/bazelbuild-mirror.tar"
zip -q0r - bazelbuild | gsutil cp - "gs://bazel-git-mirror/bazelbuild-mirror.zip"