refactor(workflow): streamline sudo handling and improve script readability

This commit is contained in:
2026-05-06 22:06:27 +08:00
parent cce9abd3ed
commit 23144a1280
+104 -104
View File
@@ -613,20 +613,20 @@ REMOTE_SCRIPT
printf 'USE_SUDO=%s\n' "${NAS_USE_SUDO}"
printf 'SUDO_PASSWORD_B64=%s\n' "${sudo_password_b64}"
cat <<'REMOTE_SCRIPT'
set -eu
SUDO_PASSWORD="$(printf '%s' "${SUDO_PASSWORD_B64}" | base64 -d 2>/dev/null || true)"
unset SUDO_PASSWORD_B64
set -eu
SUDO_PASSWORD="$(printf '%s' "${SUDO_PASSWORD_B64}" | base64 -d 2>/dev/null || true)"
unset SUDO_PASSWORD_B64
run_cmd() {
if [ "${USE_SUDO}" = "true" ]; then
printf '%s\n' "${SUDO_PASSWORD}" | sudo -S -p "" "$@"
else
"$@"
fi
}
run_cmd() {
if [ "${USE_SUDO}" = "true" ]; then
printf '%s\n' "${SUDO_PASSWORD}" | sudo -S -p "" "$@"
else
"$@"
fi
}
run_cmd mkdir -p "${OUTPUT_DIR}/${RELEASE_NAME}"
REMOTE_SCRIPT
run_cmd mkdir -p "${OUTPUT_DIR}/${RELEASE_NAME}"
REMOTE_SCRIPT
} | SSHPASS="${nas_ssh_password}" sshpass -e ssh ${ssh_opts} "${remote}" "sh -s"
tar -C desktop-artifacts -czf "${archive_path}" .
@@ -638,18 +638,18 @@ REMOTE_SCRIPT
printf 'USE_SUDO=%s\n' "${NAS_USE_SUDO}"
printf 'SUDO_PASSWORD_B64=%s\n' "${sudo_password_b64}"
cat <<'REMOTE_SCRIPT'
set -eu
SUDO_PASSWORD="$(printf '%s' "${SUDO_PASSWORD_B64}" | base64 -d 2>/dev/null || true)"
unset SUDO_PASSWORD_B64
set -eu
SUDO_PASSWORD="$(printf '%s' "${SUDO_PASSWORD_B64}" | base64 -d 2>/dev/null || true)"
unset SUDO_PASSWORD_B64
if [ "${USE_SUDO}" = "true" ]; then
printf '%s\n' "${SUDO_PASSWORD}" | sudo -S -p "" tar -xzf "${REMOTE_ARCHIVE}" -C "${REMOTE_RELEASE_DIR}"
rm -f "${REMOTE_ARCHIVE}"
else
tar -xzf "${REMOTE_ARCHIVE}" -C "${REMOTE_RELEASE_DIR}"
rm -f "${REMOTE_ARCHIVE}"
fi
REMOTE_SCRIPT
if [ "${USE_SUDO}" = "true" ]; then
printf '%s\n' "${SUDO_PASSWORD}" | sudo -S -p "" tar -xzf "${REMOTE_ARCHIVE}" -C "${REMOTE_RELEASE_DIR}"
rm -f "${REMOTE_ARCHIVE}"
else
tar -xzf "${REMOTE_ARCHIVE}" -C "${REMOTE_RELEASE_DIR}"
rm -f "${REMOTE_ARCHIVE}"
fi
REMOTE_SCRIPT
} | SSHPASS="${nas_ssh_password}" sshpass -e ssh ${ssh_opts} "${remote}" "sh -s"
{
@@ -658,19 +658,19 @@ REMOTE_SCRIPT
printf 'USE_SUDO=%s\n' "${NAS_USE_SUDO}"
printf 'SUDO_PASSWORD_B64=%s\n' "${sudo_password_b64}"
cat <<'REMOTE_SCRIPT'
set -eu
SUDO_PASSWORD="$(printf '%s' "${SUDO_PASSWORD_B64}" | base64 -d 2>/dev/null || true)"
unset SUDO_PASSWORD_B64
set -eu
SUDO_PASSWORD="$(printf '%s' "${SUDO_PASSWORD_B64}" | base64 -d 2>/dev/null || true)"
unset SUDO_PASSWORD_B64
if [ "${USE_SUDO}" = "true" ]; then
tmp_file="$(mktemp)"
printf '%s\n' "${RELEASE_NAME}" > "${tmp_file}"
printf '%s\n' "${SUDO_PASSWORD}" | sudo -S -p "" cp "${tmp_file}" "${OUTPUT_DIR}/latest-desktop-client.txt"
rm -f "${tmp_file}"
else
printf '%s\n' "${RELEASE_NAME}" > "${OUTPUT_DIR}/latest-desktop-client.txt"
fi
REMOTE_SCRIPT
if [ "${USE_SUDO}" = "true" ]; then
tmp_file="$(mktemp)"
printf '%s\n' "${RELEASE_NAME}" > "${tmp_file}"
printf '%s\n' "${SUDO_PASSWORD}" | sudo -S -p "" cp "${tmp_file}" "${OUTPUT_DIR}/latest-desktop-client.txt"
rm -f "${tmp_file}"
else
printf '%s\n' "${RELEASE_NAME}" > "${OUTPUT_DIR}/latest-desktop-client.txt"
fi
REMOTE_SCRIPT
} | SSHPASS="${nas_ssh_password}" sshpass -e ssh ${ssh_opts} "${remote}" "sh -s"
{
@@ -679,89 +679,89 @@ REMOTE_SCRIPT
printf 'USE_SUDO=%s\n' "${NAS_USE_SUDO}"
printf 'SUDO_PASSWORD_B64=%s\n' "${sudo_password_b64}"
cat <<'REMOTE_SCRIPT'
set -eu
SUDO_PASSWORD="$(printf '%s' "${SUDO_PASSWORD_B64}" | base64 -d 2>/dev/null || true)"
unset SUDO_PASSWORD_B64
set -eu
SUDO_PASSWORD="$(printf '%s' "${SUDO_PASSWORD_B64}" | base64 -d 2>/dev/null || true)"
unset SUDO_PASSWORD_B64
run_cmd() {
if [ "${USE_SUDO}" = "true" ]; then
printf '%s\n' "${SUDO_PASSWORD}" | sudo -S -p "" "$@"
else
"$@"
fi
}
run_cmd() {
if [ "${USE_SUDO}" = "true" ]; then
printf '%s\n' "${SUDO_PASSWORD}" | sudo -S -p "" "$@"
else
"$@"
fi
}
versioned_paths_desc() {
root="$1"
pattern="$2"
prefix="$3"
suffix="$4"
versioned_paths_desc() {
root="$1"
pattern="$2"
prefix="$3"
suffix="$4"
for candidate in "${root}"/${pattern}; do
[ -e "${candidate}" ] || continue
name="${candidate##*/}"
version="${name#${prefix}}"
if [ -n "${suffix}" ]; then
version="${version%${suffix}}"
fi
for candidate in "${root}"/${pattern}; do
[ -e "${candidate}" ] || continue
name="${candidate##*/}"
version="${name#${prefix}}"
if [ -n "${suffix}" ]; then
version="${version%${suffix}}"
fi
case "${version}" in
*[!0-9.]*|""|*.*.*.*)
continue
;;
esac
case "${version}" in
*[!0-9.]*|""|*.*.*.*)
continue
;;
esac
major="$(printf '%s' "${version}" | cut -d. -f1)"
minor="$(printf '%s' "${version}" | cut -d. -f2)"
patch="$(printf '%s' "${version}" | cut -d. -f3)"
major="$(printf '%s' "${version}" | cut -d. -f1)"
minor="$(printf '%s' "${version}" | cut -d. -f2)"
patch="$(printf '%s' "${version}" | cut -d. -f3)"
case "${major}${minor}${patch}" in
*[!0-9]*|"")
continue
;;
esac
case "${major}${minor}${patch}" in
*[!0-9]*|"")
continue
;;
esac
printf '%s.%s.%s %s\n' "${major}" "${minor}" "${patch}" "${candidate}"
done | sort -t. -k1,1nr -k2,2nr -k3,3nr | awk '{print $2}'
}
printf '%s.%s.%s %s\n' "${major}" "${minor}" "${patch}" "${candidate}"
done | sort -t. -k1,1nr -k2,2nr -k3,3nr | awk '{print $2}'
}
keep_latest_two() {
root="$1"
pattern="$2"
prefix="$3"
suffix="$4"
mode="$5"
keep=0
keep_latest_two() {
root="$1"
pattern="$2"
prefix="$3"
suffix="$4"
mode="$5"
keep=0
for path in $(versioned_paths_desc "${root}" "${pattern}" "${prefix}" "${suffix}"); do
keep=$((keep + 1))
if [ "${keep}" -gt 2 ]; then
if [ "${mode}" = "dir" ]; then
run_cmd rm -rf "${path}"
else
run_cmd rm -f "${path}"
fi
fi
done
}
for path in $(versioned_paths_desc "${root}" "${pattern}" "${prefix}" "${suffix}"); do
keep=$((keep + 1))
if [ "${keep}" -gt 2 ]; then
if [ "${mode}" = "dir" ]; then
run_cmd rm -rf "${path}"
else
run_cmd rm -f "${path}"
fi
fi
done
}
for platform in mac win; do
release_platform_dir="${OUTPUT_DIR}/desktop-client-${CLIENT_VERSION}/${platform}"
[ -d "${release_platform_dir}" ] || continue
for platform in mac win; do
release_platform_dir="${OUTPUT_DIR}/desktop-client-${CLIENT_VERSION}/${platform}"
[ -d "${release_platform_dir}" ] || continue
platform_root="${OUTPUT_DIR}/${platform}"
run_cmd mkdir -p "${platform_root}"
platform_root="${OUTPUT_DIR}/${platform}"
run_cmd mkdir -p "${platform_root}"
for zip_file in "${release_platform_dir}"/*.zip; do
[ -f "${zip_file}" ] || continue
run_cmd cp -p "${zip_file}" "${platform_root}/"
done
for zip_file in "${release_platform_dir}"/*.zip; do
[ -f "${zip_file}" ] || continue
run_cmd cp -p "${zip_file}" "${platform_root}/"
done
keep_latest_two "${platform_root}" "省心推-${platform}-*.zip" "省心推-${platform}-" ".zip" "file"
done
keep_latest_two "${platform_root}" "省心推-${platform}-*.zip" "省心推-${platform}-" ".zip" "file"
done
keep_latest_two "${OUTPUT_DIR}" "desktop-client-*" "desktop-client-" "" "dir"
REMOTE_SCRIPT
keep_latest_two "${OUTPUT_DIR}" "desktop-client-*" "desktop-client-" "" "dir"
REMOTE_SCRIPT
} | SSHPASS="${nas_ssh_password}" sshpass -e ssh ${ssh_opts} "${remote}" "sh -s"
echo "Uploaded desktop client ${CLIENT_VERSION} to ${remote}:${remote_release_dir}"