#!/bin/bash -ex #API="$GITHUB_SERVER_URL/api/actions_pipeline/_apis/pipelines/workflows/$GITHUB_RUN_ID/artifacts" #[ -n "$INPUT_RETENTION_DAYS" ] && RETENTION="retentionDays=$INPUT_RETENTION_DAYS" #CURL=(curl --fail # --header "Authorization: Bearer $ACTIONS_RUNTIME_TOKEN" # --data '{"Type":"actions_storage","Name":"'"$INPUT_NAME"'"}' #) # #"${CURL[@]}" "$API" -oresp0.json #cat resp0.json #UPLOAD_URL=$(jq -r '.fileContainerResourceUrl' resp0.json) #rm -f resp0.json # #for artifact in $INPUT_PATH; do # content_length=$(stat -c '%s' "$artifact") # md5="$(openssl md5 -binary "$artifact" | base64)" # "${CURL[@]}" -XPUT -o resp1.json \ # --header "x-actions-results-md5: $md5" \ # --header "x-tfs-filelength: $content_length" \ # --header "content-range: bytes 0-$((content_length - 1))/$content_length" \ # "$UPLOAD_URL?$RETENTION&itemPath=$INPUT_NAME%2F$artifact" # cat resp1.json # "${CURL[@]}" -XPATCH -oresp2.json "$API&artifactName=$INPUT_NAME" # cat resp2.json # rm -f resp1.json resp2.json #done function get_ids_from_token() { local ids mapfile -t ids \ < <(jq -Rr 'split(".")[1] | @base64d | fromjson | .scp | split(":")' <<< "$ACTIONS_RUNTIME_TOKEN") WORKFLOWRUNID="${ids[2]}" WORKFLOWJOBRUNID="${ids[3]}" } [ -n "$INPUT_RETENTION_DAYS" ] && RETENTION=", \"retention_days\": $INPUT_RETENTION_DAYS" get_ids_from_token # Get the size of the artifact in bytes ARTIFACT_SIZE="$(stat -c '%s' "$INPUT_PATH")" # Step 1: Create the artifact CREATE_ARTIFACT_RESPONSE=$(curl -s -X POST -H "Authorization: token $ACTIONS_RUNTIME_TOKEN" \ -d "{\"name\": \"$INPUT_NAME\", \"size_in_bytes\": $ARTIFACT_SIZE$RETENTION}" \ "https://$GITHUB_SERVER_URL/api/repos/$GITHUB_REPOSITORY/actions/runs/$WORKFLOWRUNID/artifacts") # Extract the upload URL from the response UPLOAD_URL=$(echo "$CREATE_ARTIFACT_RESPONSE" | jq -r '.upload_url' | sed 's/{?name,label}//') if [[ "$UPLOAD_URL" == "null" ]]; then echo "Error: Failed to create artifact. Response: $CREATE_ARTIFACT_RESPONSE" exit 1 fi echo "Artifact upload URL: $UPLOAD_URL" # Step 2: Upload the artifact file UPLOAD_RESPONSE=$(curl -s -X POST -H "Authorization: token $ACTIONS_RUNTIME_TOKEN" \ -H "Content-Type: application/zip" \ --data-binary @"$INPUT_PATH" \ "$UPLOAD_URL?name=$INPUT_NAME") # Check if upload was successful if echo "$UPLOAD_RESPONSE" | grep -q '"id"'; then echo "Artifact uploaded successfully!" else echo "Error uploading artifact. Response: $UPLOAD_RESPONSE" exit 1 fi