Skip to content
Permalink
Branch: master
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
99 lines (91 sloc) 3.82 KB
#!/bin/bash
set -e
if [ -z "$PLUGIN_MOUNT" ]; then
echo "Specify folders to cache in the mount property! Plugin won't do anything!"
exit 0
fi
if [[ $DRONE_COMMIT_MESSAGE == *"[NO CACHE]"* ]]; then
echo "Found [NO CACHE] in commit message, skipping cache restore and rebuild!"
exit 0
fi
CACHE_PATH="$DRONE_REPO_OWNER/$DRONE_REPO_NAME/$DRONE_JOB_NUMBER"
if [[ -n "$PLUGIN_CACHE_KEY" ]]; then
function join_by { local IFS="$1"; shift; echo "$*"; }
IFS=','; read -ra CACHE_PATH_VARS <<< "$PLUGIN_CACHE_KEY"
CACHE_PATH_VALUES=()
for env_var in "${CACHE_PATH_VARS[@]}"; do
env_var_value="${!env_var}"
if [[ -z "$env_var_value" ]]; then
echo "Warning! Environment variable '${env_var}' does not contain a value, it will be ignored!"
else
CACHE_PATH_VALUES+=("${env_var_value}")
fi
done
CACHE_PATH=$(join_by / "${CACHE_PATH_VALUES[@]}")
fi
if [[ -e ".cache_key" ]]; then
echo "Found a .cache_key file to be used as the cache path!"
CACHE_PATH=$(cut -c-$(getconf NAME_MAX /) .cache_key | head -n 1)
if [[ -n "$PLUGIN_CACHE_KEY_DISABLE_SANITIZE" && "$PLUGIN_CACHE_KEY_DISABLE_SANITIZE" == "true" ]]; then
echo "Warning! .cache_key will be used as-is. Sanitization is your responsibility to make it filename friendly!"
else
CACHE_PATH=$(echo "$CACHE_PATH" | md5sum | cut -d ' ' -f 1)
fi
fi
IFS=','; read -ra SOURCES <<< "$PLUGIN_MOUNT"
if [[ -n "$PLUGIN_REBUILD" && "$PLUGIN_REBUILD" == "true" ]]; then
# Create cache
for source in "${SOURCES[@]}"; do
if [ -d "$source" ]; then
echo "Rebuilding cache for folder $source..."
mkdir -p "/cache/$CACHE_PATH/$source" && \
rsync -aHA --delete "$source/" "/cache/$CACHE_PATH/$source"
elif [ -f "$source" ]; then
echo "Rebuilding cache for file $source..."
source_dir=$(dirname $source)
mkdir -p "/cache/$CACHE_PATH/$source_dir" && \
rsync -aHA --delete "$source" "/cache/$CACHE_PATH/$source_dir/"
else
echo "$source does not exist, removing from cached folder..."
rm -rf "/cache/$CACHE_PATH/$source"
fi
done
elif [[ -n "$PLUGIN_RESTORE" && "$PLUGIN_RESTORE" == "true" ]]; then
# Clear existing cache if asked in commit message
if [[ $DRONE_COMMIT_MESSAGE == *"[CLEAR CACHE]"* ]]; then
if [ -d "/cache/$CACHE_PATH" ]; then
echo "Found [CLEAR CACHE] in commit message, clearing cache..."
rm -rf "/cache/$CACHE_PATH"
exit 0
fi
fi
# Remove files older than TTL
if [[ -n "$PLUGIN_TTL" && "$PLUGIN_TTL" > "0" ]]; then
if [[ $PLUGIN_TTL =~ ^[0-9]+$ ]]; then
if [ -d "/cache/$CACHE_PATH" ]; then
echo "Removing files and (empty) folders older than $PLUGIN_TTL days..."
find "/cache/$CACHE_PATH" -type f -ctime +$PLUGIN_TTL -delete
find "/cache/$CACHE_PATH" -type d -ctime +$PLUGIN_TTL -empty -delete
fi
else
echo "Invalid value for ttl, please enter a positive integer. Plugin will ignore ttl."
fi
fi
# Restore from cache
for source in "${SOURCES[@]}"; do
if [ -d "/cache/$CACHE_PATH/$source" ]; then
echo "Restoring cache for folder $source..."
mkdir -p "$source" && \
rsync -aHA --delete "/cache/$CACHE_PATH/$source/" "$source"
elif [ -f "/cache/$CACHE_PATH/$source" ]; then
echo "Restoring cache for file $source..."
source_dir=$(dirname $source)
mkdir -p "$source_dir" && \
rsync -aHA --delete "/cache/$CACHE_PATH/$source" "$source_dir/"
else
echo "No cache for $source"
fi
done
else
echo "No restore or rebuild flag specified, plugin won't do anything!"
fi
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.