signpath-publish-signed.sh 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #!/usr/bin/env bash
  2. set -euo pipefail
  3. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  4. REPO_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)"
  5. DIST_DIR="${DIST_DIR:-${REPO_ROOT}/dist}"
  6. ARCH="${ARCH:-amd64}"
  7. ZIP_NAME="OliveTin-windows-${ARCH}.zip"
  8. MSI_NAME="OliveTin-windows-${ARCH}.msi"
  9. CHECKSUMS_NAME="checksums.txt"
  10. usage() {
  11. echo "Usage: $(basename "$0") <release-tag> <signed-zip-path> <signed-msi-path>" >&2
  12. exit 1
  13. }
  14. TAG="${1:-}"
  15. SIGNED_ZIP="${2:-}"
  16. SIGNED_MSI="${3:-}"
  17. if [[ -z "${TAG}" || -z "${SIGNED_ZIP}" || -z "${SIGNED_MSI}" ]]; then
  18. usage
  19. fi
  20. if [[ ! -f "${SIGNED_ZIP}" ]]; then
  21. echo "Signed zip not found: ${SIGNED_ZIP}" >&2
  22. exit 1
  23. fi
  24. if [[ ! -f "${SIGNED_MSI}" ]]; then
  25. echo "Signed MSI not found: ${SIGNED_MSI}" >&2
  26. exit 1
  27. fi
  28. if ! command -v gh >/dev/null; then
  29. echo "gh is required to update the GitHub release" >&2
  30. exit 1
  31. fi
  32. mkdir -p "${DIST_DIR}"
  33. cp -f "${SIGNED_ZIP}" "${DIST_DIR}/${ZIP_NAME}"
  34. cp -f "${SIGNED_MSI}" "${DIST_DIR}/${MSI_NAME}"
  35. checksums_path="${DIST_DIR}/${CHECKSUMS_NAME}"
  36. checksums_backup="${DIST_DIR}/${CHECKSUMS_NAME}.orig"
  37. if ! gh release download "${TAG}" --pattern "${CHECKSUMS_NAME}" --dir "${DIST_DIR}" --clobber; then
  38. echo "Failed to download ${CHECKSUMS_NAME} from release ${TAG}" >&2
  39. exit 1
  40. fi
  41. if [[ ! -f "${checksums_path}" ]]; then
  42. echo "${CHECKSUMS_NAME} not found after download from release ${TAG}" >&2
  43. exit 1
  44. fi
  45. cp -f "${checksums_path}" "${checksums_backup}"
  46. update_checksum() {
  47. local file_name="${1}"
  48. local new_checksum
  49. new_checksum="$(cd "${DIST_DIR}" && sha256sum "${file_name}")"
  50. if [[ -f "${checksums_path}" ]] && grep -qF " ${file_name}" "${checksums_path}"; then
  51. local tmp
  52. tmp="$(mktemp)"
  53. grep -vF " ${file_name}" "${checksums_path}" > "${tmp}" || true
  54. printf '%s\n' "${new_checksum}" >> "${tmp}"
  55. mv "${tmp}" "${checksums_path}"
  56. else
  57. printf '%s\n' "${new_checksum}" >> "${checksums_path}"
  58. fi
  59. }
  60. update_checksum "${ZIP_NAME}"
  61. update_checksum "${MSI_NAME}"
  62. # Upload binaries first so a failed checksums upload can restore the previous file.
  63. # --clobber overwrites same-named assets (needed if the sign job is re-run).
  64. gh release upload "${TAG}" \
  65. "${DIST_DIR}/${ZIP_NAME}" \
  66. "${DIST_DIR}/${MSI_NAME}" \
  67. --clobber
  68. if ! gh release upload "${TAG}" "${checksums_path}" --clobber; then
  69. echo "Failed to upload updated ${CHECKSUMS_NAME}; restoring previous asset" >&2
  70. restore_dir="$(mktemp -d)"
  71. cp -f "${checksums_backup}" "${restore_dir}/${CHECKSUMS_NAME}"
  72. gh release upload "${TAG}" "${restore_dir}/${CHECKSUMS_NAME}" --clobber
  73. rm -rf "${restore_dir}"
  74. exit 1
  75. fi
  76. echo "Uploaded signed ${ZIP_NAME} and ${MSI_NAME} to release ${TAG}"