ci-actions/deno-release/entrypoint.sh
Emma a198601c34
All checks were successful
Build and Push Deno Release Action / build-and-publish (push) Successful in 26s
Build and Push Version Check Action / build (push) Successful in 18s
changes actions to composite because packages are only private which is stupid and inane and shouldn't be that way like what the actual hell why can't they just make things logical
2025-05-06 22:07:43 -06:00

108 lines
3.0 KiB
Bash
Executable File

#!/bin/bash
set -euo pipefail
ENTRYPOINT="$1"
FLAGS_STRING="${2:-}"
IFS=' ' read -r -a DENOCOMPILE_FLAGS <<< "$FLAGS_STRING"
TAG_NAME=$(git describe --tags --abbrev=0)
REPO_NAME=$(basename -s .git "$(git config --get remote.origin.url)")
OWNER_NAME=$(basename "$(dirname "$(git config --get remote.origin.url)")")
TMPDIR=$(mktemp -d)
echo "Building for tag: $TAG_NAME"
echo "Using entrypoint: $ENTRYPOINT"
echo "With flags: ${DENOCOMPILE_FLAGS[*]}"
platforms=(
"x86_64-unknown-linux-gnu"
"x86_64-pc-windows-msvc"
"x86_64-apple-darwin"
)
for target in "${platforms[@]}"; do
echo "Compiling for $target"
outfile="${TMPDIR}/${REPO_NAME}-${target}"
[[ "$target" == *"windows"* ]] && outfile="${outfile}.exe"
deno compile \
--target="$target" \
--output="$outfile" \
"${DENOCOMPILE_FLAGS[@]}" \
"$ENTRYPOINT"
done
# Generate changelog
PREV_TAG=$(git describe --tags --abbrev=0 "$TAG_NAME"^ 2>/dev/null || echo "")
if [[ -n "$PREV_TAG" ]]; then
COMMITS=$(git log "$PREV_TAG..$TAG_NAME" --pretty=format:"%s (%an)" --no-merges)
else
COMMITS=$(git log --pretty=format:"%s (%an)" --no-merges)
fi
CHANGELOG=""
append_section() {
local TYPE="$1"
local TITLE="$2"
local EMOJI="$3"
local MATCHED=$(echo "$COMMITS" | grep -E "^${TYPE}: " || true)
if [[ -n "$MATCHED" ]]; then
CHANGELOG+="## $EMOJI $TITLE\n"
while IFS= read -r line; do
local CLEANED=$(echo "$line" | sed -E "s/^${TYPE}: //")
CHANGELOG+="- $CLEANED\n"
done <<< "$MATCHED"
CHANGELOG+="\n"
fi
}
append_section "feat" "Features" "✨"
append_section "fix" "Fixes" "🐛"
append_section "chore" "Chores" "🧹"
# Fallback if no commits found
[[ -z "$CHANGELOG" ]] && CHANGELOG="No commit history found."
# Inject into manual changelog if available
MANUAL_SECTION=""
if [[ -f "CHANGELOG.md" ]]; then
MANUAL_SECTION=$(awk "/^## \\[?$TAG_NAME\\]? /{flag=1; next} /^## /{flag=0} flag" CHANGELOG.md)
if [[ "$MANUAL_SECTION" == *"<!-- auto-changelog -->"* ]]; then
MANUAL_SECTION=$(echo "$MANUAL_SECTION" | sed "s|<!-- auto-changelog -->|$CHANGELOG|")
fi
fi
RELEASE_BODY="${MANUAL_SECTION:-$CHANGELOG}"
RELEASE_BODY_ESCAPED=$(printf "%s" "$RELEASE_BODY" | sed ':a;N;$!ba;s/\n/\\n/g; s/"/\\"/g')
# Determine prerelease
IS_PRERELEASE="false"
[[ "$TAG_NAME" =~ -[0-9A-Za-z] ]] && IS_PRERELEASE="true"
# Create release
API_URL="${CI_SERVER_URL:-https://git.cyborggrizzly.com}/api/v1"
RELEASE_ENDPOINT="$API_URL/repos/$OWNER_NAME/$REPO_NAME/releases"
RELEASE_JSON=$(curl -sS -X POST "$RELEASE_ENDPOINT" \
-H "Authorization: token $GITEA_TOKEN" \
-H "Content-Type: application/json" \
-d @- <<EOF
{
"tag_name": "$TAG_NAME",
"name": "$TAG_NAME",
"draft": false,
"prerelease": $IS_PRERELEASE,
"body": "$RELEASE_BODY_ESCAPED"
}
EOF
)
UPLOAD_URL=$(echo "$RELEASE_JSON" | jq -r '.upload_url // .assets_url')
for file in "$TMPDIR"/*; do
FILENAME=$(basename "$file")
echo "Uploading $FILENAME..."
curl -sS -X POST "$UPLOAD_URL" \
-H "Authorization: token $GITEA_TOKEN" \
-F name="$FILENAME" \
-F attachment=@"$file"
done