#!/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 #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) # } #} #