feat(deploy): enhance deployment scripts with locking mechanism and metadata tracking
Deployment Config CI / Deployment Config (push) Successful in 16s
Deployment Config CI / Deployment Config (push) Successful in 16s
This commit is contained in:
@@ -545,11 +545,78 @@ jobs:
|
||||
shared_dir="${DEPLOY_BASE}/shared"
|
||||
lock_dir="${DEPLOY_BASE}/.deploy.lock"
|
||||
|
||||
if ! mkdir "${lock_dir}" 2>/dev/null; then
|
||||
echo "Another deployment is already running: ${lock_dir}"
|
||||
exit 1
|
||||
fi
|
||||
trap 'rmdir "${lock_dir}"' EXIT INT TERM
|
||||
lock_owned=false
|
||||
|
||||
write_lock_metadata() {
|
||||
printf '%s\n' "$$" > "${lock_dir}/pid"
|
||||
printf '%s\n' "${RELEASE_ID}" > "${lock_dir}/release_id"
|
||||
printf '%s\n' "${IMAGE_TAG}" > "${lock_dir}/image_tag"
|
||||
printf '%s\n' "${SERVICE_LIST}" > "${lock_dir}/services"
|
||||
date -u '+%Y-%m-%dT%H:%M:%SZ' > "${lock_dir}/created_at" 2>/dev/null || true
|
||||
}
|
||||
|
||||
print_lock_metadata() {
|
||||
echo " pid: $(cat "${lock_dir}/pid" 2>/dev/null || echo unknown)"
|
||||
echo " release: $(cat "${lock_dir}/release_id" 2>/dev/null || echo unknown)"
|
||||
echo " image tag: $(cat "${lock_dir}/image_tag" 2>/dev/null || echo unknown)"
|
||||
echo " services: $(cat "${lock_dir}/services" 2>/dev/null || echo unknown)"
|
||||
echo " created: $(cat "${lock_dir}/created_at" 2>/dev/null || echo unknown)"
|
||||
}
|
||||
|
||||
acquire_deploy_lock() {
|
||||
if mkdir "${lock_dir}" 2>/dev/null; then
|
||||
lock_owned=true
|
||||
write_lock_metadata
|
||||
return 0
|
||||
fi
|
||||
|
||||
existing_pid="$(cat "${lock_dir}/pid" 2>/dev/null || true)"
|
||||
if [ -z "${existing_pid}" ]; then
|
||||
sleep 2
|
||||
existing_pid="$(cat "${lock_dir}/pid" 2>/dev/null || true)"
|
||||
fi
|
||||
|
||||
case "${existing_pid}" in
|
||||
""|*[!0-9]*)
|
||||
echo "Another deployment may already be running: ${lock_dir}"
|
||||
print_lock_metadata
|
||||
echo "This lock has no PID metadata, so it may have been created by an older workflow."
|
||||
echo "After confirming no NAS Compose deployment is active, remove it with:"
|
||||
echo " rm -rf '${lock_dir}'"
|
||||
exit 1
|
||||
;;
|
||||
*)
|
||||
if kill -0 "${existing_pid}" 2>/dev/null; then
|
||||
echo "Another deployment is already running: ${lock_dir}"
|
||||
print_lock_metadata
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
echo "Removing stale deployment lock: ${lock_dir}"
|
||||
print_lock_metadata
|
||||
rm -rf "${lock_dir}"
|
||||
|
||||
if ! mkdir "${lock_dir}" 2>/dev/null; then
|
||||
echo "Another deployment is already running: ${lock_dir}"
|
||||
exit 1
|
||||
fi
|
||||
lock_owned=true
|
||||
write_lock_metadata
|
||||
}
|
||||
|
||||
release_deploy_lock() {
|
||||
if [ "${lock_owned}" = "true" ]; then
|
||||
owner_pid="$(cat "${lock_dir}/pid" 2>/dev/null || true)"
|
||||
if [ "${owner_pid}" = "$$" ]; then
|
||||
rm -rf "${lock_dir}"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
acquire_deploy_lock
|
||||
trap 'release_deploy_lock' EXIT INT TERM
|
||||
|
||||
if [ ! -f "${shared_dir}/.env" ]; then
|
||||
cp "${release_dir}/deploy/.env.example" "${shared_dir}/.env"
|
||||
|
||||
@@ -621,11 +621,78 @@ jobs:
|
||||
lock_dir="${DEPLOY_BASE}/.deploy.lock"
|
||||
rendered_dir="${release_dir}/.k3s-rendered"
|
||||
|
||||
if ! mkdir "${lock_dir}" 2>/dev/null; then
|
||||
echo "Another deployment is already running: ${lock_dir}"
|
||||
exit 1
|
||||
fi
|
||||
trap 'rmdir "${lock_dir}"' EXIT INT TERM
|
||||
lock_owned=false
|
||||
|
||||
write_lock_metadata() {
|
||||
printf '%s\n' "$$" > "${lock_dir}/pid"
|
||||
printf '%s\n' "${RELEASE_ID}" > "${lock_dir}/release_id"
|
||||
printf '%s\n' "${IMAGE_TAG}" > "${lock_dir}/image_tag"
|
||||
printf '%s\n' "${SELECTED_TARGET}" > "${lock_dir}/target"
|
||||
date -u '+%Y-%m-%dT%H:%M:%SZ' > "${lock_dir}/created_at" 2>/dev/null || true
|
||||
}
|
||||
|
||||
print_lock_metadata() {
|
||||
echo " pid: $(cat "${lock_dir}/pid" 2>/dev/null || echo unknown)"
|
||||
echo " release: $(cat "${lock_dir}/release_id" 2>/dev/null || echo unknown)"
|
||||
echo " image tag: $(cat "${lock_dir}/image_tag" 2>/dev/null || echo unknown)"
|
||||
echo " target: $(cat "${lock_dir}/target" 2>/dev/null || echo unknown)"
|
||||
echo " created: $(cat "${lock_dir}/created_at" 2>/dev/null || echo unknown)"
|
||||
}
|
||||
|
||||
acquire_deploy_lock() {
|
||||
if mkdir "${lock_dir}" 2>/dev/null; then
|
||||
lock_owned=true
|
||||
write_lock_metadata
|
||||
return 0
|
||||
fi
|
||||
|
||||
existing_pid="$(cat "${lock_dir}/pid" 2>/dev/null || true)"
|
||||
if [ -z "${existing_pid}" ]; then
|
||||
sleep 2
|
||||
existing_pid="$(cat "${lock_dir}/pid" 2>/dev/null || true)"
|
||||
fi
|
||||
|
||||
case "${existing_pid}" in
|
||||
""|*[!0-9]*)
|
||||
echo "Another deployment may already be running: ${lock_dir}"
|
||||
print_lock_metadata
|
||||
echo "This lock has no PID metadata, so it may have been created by an older workflow."
|
||||
echo "After confirming no NAS k3s deployment is active, remove it with:"
|
||||
echo " rm -rf '${lock_dir}'"
|
||||
exit 1
|
||||
;;
|
||||
*)
|
||||
if kill -0 "${existing_pid}" 2>/dev/null; then
|
||||
echo "Another deployment is already running: ${lock_dir}"
|
||||
print_lock_metadata
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
echo "Removing stale deployment lock: ${lock_dir}"
|
||||
print_lock_metadata
|
||||
rm -rf "${lock_dir}"
|
||||
|
||||
if ! mkdir "${lock_dir}" 2>/dev/null; then
|
||||
echo "Another deployment is already running: ${lock_dir}"
|
||||
exit 1
|
||||
fi
|
||||
lock_owned=true
|
||||
write_lock_metadata
|
||||
}
|
||||
|
||||
release_deploy_lock() {
|
||||
if [ "${lock_owned}" = "true" ]; then
|
||||
owner_pid="$(cat "${lock_dir}/pid" 2>/dev/null || true)"
|
||||
if [ "${owner_pid}" = "$$" ]; then
|
||||
rm -rf "${lock_dir}"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
acquire_deploy_lock
|
||||
trap 'release_deploy_lock' EXIT INT TERM
|
||||
|
||||
SUDO_PASSWORD="$(printf '%s' "${SUDO_PASSWORD_B64}" | base64 -d 2>/dev/null || true)"
|
||||
REGISTRY_PASSWORD="$(printf '%s' "${REGISTRY_PASSWORD_B64}" | base64 -d 2>/dev/null || true)"
|
||||
|
||||
Reference in New Issue
Block a user