#!/bin/bash if [[ -n "$TOKEN" ]]; then GITHUB_TOKEN=$TOKEN fi if [[ -z "$GITHUB_TOKEN" ]]; then echo "Set the GITHUB_TOKEN env variable." exit 1 fi if [[ -z "$GITHUB_REPOSITORY" ]]; then echo "Set the GITHUB_REPOSITORY env variable." exit 1 fi if [[ -z "$GITHUB_REF" ]]; then echo "Set the GITHUB_REF env variable." exit 1 fi URI=https://api.github.com API_VERSION=v3 API_HEADER="Accept: application/vnd.github.${API_VERSION}+json" AUTH_HEADER="Authorization: token ${GITHUB_TOKEN}" main(){ local files if [ "$#" -eq 0 ]; then echo "Must pass files to be uploaded..." exit 1 fi files=( "$@" ) # Validate the GitHub token. curl -o /dev/null -sSL -H "${AUTH_HEADER}" -H "${API_HEADER}" "${URI}/repos/${GITHUB_REPOSITORY}" || { echo "Error: Invalid repo, token or network issue!"; exit 1; } echo "Github ref: ${GITHUB_REF}" # Get the tags. tag_response=$(curl -sSL -H "${AUTH_HEADER}" -H "${API_HEADER}" "${URI}/repos/${GITHUB_REPOSITORY}/tags") tag_name=$(echo "$tag_response" | jq -e --raw-output .[0].name) # Get the latest release. latest_response=$(curl -sSL -H "${AUTH_HEADER}" -H "${API_HEADER}" "${URI}/repos/${GITHUB_REPOSITORY}/releases/latest") latest_release=$(echo "$latest_response" | jq -e --raw-output .tag_name) release_id=$(echo "$latest_response" | jq -e --raw-output .id) if [[ "$tag_name" != "$latest_release" ]] || [[ "$release_id" == "null" ]]; then # Create the release. echo "Creating release for tag name: ${tag_name}" response=$(curl -XPOST -sSL -H "${AUTH_HEADER}" -H "${API_HEADER}" "${URI}/repos/${GITHUB_REPOSITORY}/releases" --data '{"tag_name": "'"${tag_name}"'","name":"'"${tag_name}"'","draft":false,"prerelease":false}') release_id=$(echo "$response" | jq -e --raw-output .id) fi if [[ "$release_id" == "null" ]]; then echo "Release ID cannot be null." exit 1 fi # Upload the files. echo "Uploading files: ${files[*]}" echo "For tag name: ${tag_name}" # shellcheck disable=SC2068 for file in ${files[@]}; do filename=$(basename "$file") rp=$(realpath "$file") curl -sSL -H "${AUTH_HEADER}" \ --data-binary @"$rp" \ -H "Content-Type: application/octet-stream" \ "https://uploads.github.com/repos/${GITHUB_REPOSITORY}/releases/${release_id}/assets?name=${filename}&access_token=${GITHUB_TOKEN}" echo "Successfully uploaded: ${rp}" done echo "Uploading assets to ${tag_name} complete!" } main "$@"