ci-actions/deno-release/entrypoint.sh
2025-05-07 10:19:54 -06:00

109 lines
3.0 KiB
Bash
Executable File

#!/bin/bash
set -euo pipefail
set +H
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