Permalink
Cannot retrieve contributors at this time
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
drone-volume-cache/cacher.sh
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
98 lines (91 sloc)
3.82 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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 |