Dmitry Burmistrov | 4dc0719 | 2025-09-01 14:19:16 +0400 | [diff] [blame] | 1 | #!/bin/bash |
| 2 | |
| 3 | # |
| 4 | # :mod: `upload.sh` -- Artifactory upload helper |
| 5 | # ========================================================================= |
| 6 | # |
| 7 | # .. module:: upload.sh |
| 8 | # :platform: Unix |
| 9 | # :synopsys: this script uploads files to JFrog Artifactory |
| 10 | # instance |
| 11 | # |
| 12 | # .. envvar:: |
| 13 | # :var ARTIFACTORY_USERNAME: Access username |
| 14 | # :var ARTIFACTORY_PASSWORD: Access password |
| 15 | # :var ARTIFACTORY_URL: Artifactory api url |
| 16 | # :var ARTIFACTORY_TARGET: Path at the repository for uploading |
| 17 | # including repository name |
| 18 | # :var ARTIFACTORY_PROPS: Optional artifact properties |
| 19 | # :var FILE_TO_UPLOAD: Path to local file to upload |
| 20 | # |
| 21 | # .. requirements:: |
| 22 | # * ``awk`` |
| 23 | # * ``cat`` |
| 24 | # * ``curl`` |
| 25 | # * ``echo`` |
| 26 | # * ``grep`` |
| 27 | # * ``mktemp`` |
| 28 | # * ``sed`` |
| 29 | # * ``sha1sum`` |
| 30 | # * ``touch`` |
| 31 | # |
| 32 | |
| 33 | cleanup_tmpfiles() { |
| 34 | trap EXIT |
| 35 | [ -d "${TMP_DIR}" ] && rm -rf "${TMP_DIR}" |
| 36 | exit 0 |
| 37 | } |
| 38 | |
| 39 | TMP_DIR=$(mktemp -d) |
| 40 | trap cleanup_tmpfiles EXIT |
| 41 | |
| 42 | STDOUT_FILE=${TMP_DIR}/stdout |
| 43 | STDERR_FILE=${TMP_DIR}/stderr |
| 44 | HEADERS_FILE=${TMP_DIR}/headers |
| 45 | touch "${STDOUT_FILE}" "${STDERR_FILE}" "${HEADERS_FILE}" |
| 46 | |
| 47 | exec 2>${STDERR_FILE} |
| 48 | |
| 49 | UPLOAD_PREFIX=${FILE_TO_UPLOAD%/*} |
| 50 | FILE_NAME=${FILE_TO_UPLOAD##*/} |
| 51 | |
| 52 | EFFECTIVE_URL="${ARTIFACTORY_URL}/${ARTIFACTORY_TARGET}/${UPLOAD_PREFIX}/${FILE_NAME};${ARTIFACTORY_PROPS}" |
| 53 | |
| 54 | FILE_SHA1_CHECKSUM=$(sha1sum "${FILE_TO_UPLOAD}" | awk '{print $1}') |
| 55 | |
| 56 | curl \ |
| 57 | --silent \ |
| 58 | --show-error \ |
| 59 | --location \ |
| 60 | --dump-header "${HEADERS_FILE}" \ |
| 61 | --output "${STDOUT_FILE}" \ |
| 62 | --user "${ARTIFACTORY_USERNAME}:${ARTIFACTORY_PASSWORD}" \ |
| 63 | --request PUT \ |
| 64 | --header "X-Checksum-Sha1:${FILE_SHA1_CHECKSUM}" \ |
| 65 | --upload-file "${FILE_TO_UPLOAD}" \ |
| 66 | --url "${EFFECTIVE_URL}" |
| 67 | |
| 68 | EXIT_CODE=$? |
| 69 | HTTP_RESPONSE_CODE=$(cat "${HEADERS_FILE}" | grep '^HTTP' | awk '{print $2}') |
| 70 | |
| 71 | if [ "${HTTP_RESPONSE_CODE:0:1}" != "2" ]; then |
| 72 | >&2 echo "Failed at ${EFFECTIVE_URL}" |
| 73 | fi |
| 74 | |
| 75 | for outfile in "${STDOUT_FILE}" "${STDERR_FILE}"; do |
| 76 | sed -z -i \ |
| 77 | -e 's|\n|\\n|g' \ |
| 78 | -e 's|"|\\"|g' \ |
| 79 | -e 's|\r||g' \ |
| 80 | "${outfile}" |
| 81 | done |
| 82 | |
| 83 | cat << EOF |
| 84 | { |
| 85 | "stdout": "$(cat ${STDOUT_FILE})", |
| 86 | "stderr": "$(cat ${STDERR_FILE})", |
| 87 | "exit_code": ${EXIT_CODE}, |
| 88 | "response_code": ${HTTP_RESPONSE_CODE:-null}, |
| 89 | } |
| 90 | EOF |