diff --git a/entrypoint.sh b/entrypoint.sh index 3d518c0..fad1638 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -1,111 +1,77 @@ #!/bin/bash -e -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 -v -D/dev/stdout - --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 +#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[1]}" -# WORKFLOWJOBRUNID="${ids[2]}" -#} -# -#get_ids_from_token -# -# const artifactClient = internalArtifactTwirpClient() -# -# const createArtifactReq: CreateArtifactRequest = { -# "$WORKFLOWRUNID" -# "$WORKFLOWJOBRUNID" -# name, -# version: 4 -# } -# -# // if there is a retention period, add it to the request -# const expiresAt = getExpiration(options?.retentionDays) -# if (expiresAt) { -# createArtifactReq.expiresAt = expiresAt -# } -# -# const createArtifactResp = -# await artifactClient.CreateArtifact(createArtifactReq) -# if (!createArtifactResp.ok) { -# throw new InvalidResponseError( -# 'CreateArtifact: response from backend was not ok' -# ) -# } -# -# const zipUploadStream = await createZipUploadStream( -# zipSpecification, -# options?.compressionLevel -# ) -# -# // Upload zip to blob storage -# const uploadResult = await uploadZipToBlobStorage( -# createArtifactResp.signedUploadUrl, -# zipUploadStream -# ) -# -# // finalize the artifact -# const finalizeArtifactReq: FinalizeArtifactRequest = { -# workflowRunBackendId: backendIds.workflowRunBackendId, -# workflowJobRunBackendId: backendIds.workflowJobRunBackendId, -# name, -# size: uploadResult.uploadSize ? uploadResult.uploadSize.toString() : '0' -# } -# -# if (uploadResult.sha256Hash) { -# finalizeArtifactReq.hash = StringValue.create({ -# value: `sha256:${uploadResult.sha256Hash}` -# }) -# } -# -# core.info(`Finalizing artifact upload`) -# -# const finalizeArtifactResp = -# await artifactClient.FinalizeArtifact(finalizeArtifactReq) -# if (!finalizeArtifactResp.ok) { -# throw new InvalidResponseError( -# 'FinalizeArtifact: response from backend was not ok' -# ) -# } -# -# const artifactId = BigInt(finalizeArtifactResp.artifactId) -# core.info( -# `Artifact ${name}.zip successfully finalized. Artifact ID ${artifactId}` -# ) -# -# return { -# size: uploadResult.uploadSize, -# digest: uploadResult.sha256Hash, -# id: Number(artifactId) -# } -#} -# +function get_ids_from_token() { + local ids + + mapfile -t ids \ + < <(jq -Rr 'split(".")[1] | @base64d | fromjson | .scp | split(":")' <<< "$ACTIONS_RUNTIME_TOKEN") + + WORKFLOWRUNID="${ids[1]}" + WORKFLOWJOBRUNID="${ids[2]}" +} + +[ -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" \ + -H "Accept: application/vnd.github.v3+json" \ + -d "{\"name\": \"$INPUT_NAME\", \"size_in_bytes\": $ARTIFACT_SIZE$RETENTION}" \ + "https://api.github.com/repos/OWNER/REPO/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