feat(deploy): enhance deployment scripts with locking mechanism and metadata tracking
Deployment Config CI / Deployment Config (push) Successful in 16s

This commit is contained in:
2026-06-01 00:47:40 +08:00
parent b2ec8cc9fc
commit c5da0cf507
3 changed files with 214 additions and 13 deletions
@@ -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"
+72 -5
View File
@@ -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)"