Compare commits
13 Commits
4e01c6f59f
...
v1
Author | SHA1 | Date | |
---|---|---|---|
0150417224 | |||
5d53584cda | |||
32d800f17f | |||
4cbee1b340 | |||
817ea1715b | |||
8bd828ee96 | |||
59d8a2d83e | |||
702981a552 | |||
2784acadb1 | |||
0c32b6a51e | |||
a198601c34 | |||
92323d3829 | |||
c84c340274 |
@@ -1,4 +1,4 @@
|
|||||||
FROM denoland/deno:2.3.1
|
FROM denoland/deno:alpine-2.3.1
|
||||||
|
|
||||||
RUN apk add --no-cache zip curl bash git
|
RUN apk add --no-cache zip curl bash git
|
||||||
|
|
||||||
|
@@ -1,15 +1,20 @@
|
|||||||
name: Deno Multi-Platform Release
|
name: Deno Multi-Platform Release
|
||||||
description: Compile a Deno CLI tool for multiple platforms and attach to a Gitea release
|
description: Compile and attach binaries to a Gitea release
|
||||||
inputs:
|
inputs:
|
||||||
entrypoint:
|
entrypoint:
|
||||||
description: Path to the Deno entrypoint file (e.g., `src/main.ts`)
|
description: Deno entrypoint file (e.g., src/main.ts)
|
||||||
required: true
|
required: true
|
||||||
compile-flags:
|
compile-flags:
|
||||||
description: Optional space-separated flags to pass to `deno compile`
|
description: Optional flags to pass to `deno compile`
|
||||||
required: false
|
required: false
|
||||||
runs:
|
runs:
|
||||||
using: "docker"
|
using: "composite"
|
||||||
image: gitea.example.com/org/ci-actions/deno-release:latest
|
steps:
|
||||||
args:
|
- name: Set up Deno
|
||||||
- ${{ inputs.entrypoint }}
|
uses: denoland/setup-deno@v1
|
||||||
- ${{ inputs.compile-flags }}
|
with:
|
||||||
|
deno-version: 2.3.1
|
||||||
|
|
||||||
|
- name: Run release script
|
||||||
|
shell: bash
|
||||||
|
run: curl -sS https://git.cyborggrizzly.com/bearmetal/ci-actions/raw/branch/main/deno-release/entrypoint.sh | bash -s "${{ inputs.entrypoint }}" "${{ inputs.compile-flags }}"
|
||||||
|
65
deno-release/entrypoint.sh
Normal file → Executable file
65
deno-release/entrypoint.sh
Normal file → Executable file
@@ -32,20 +32,14 @@ for target in "${platforms[@]}"; do
|
|||||||
"$ENTRYPOINT"
|
"$ENTRYPOINT"
|
||||||
done
|
done
|
||||||
|
|
||||||
API_URL="${CI_SERVER_URL:-https://gitea.example.com}/api/v1"
|
# Generate changelog
|
||||||
RELEASE_ENDPOINT="$API_URL/repos/$OWNER_NAME/$REPO_NAME/releases"
|
|
||||||
|
|
||||||
# Get commits since the last tag
|
|
||||||
PREV_TAG=$(git describe --tags --abbrev=0 "$TAG_NAME"^ 2>/dev/null || echo "")
|
PREV_TAG=$(git describe --tags --abbrev=0 "$TAG_NAME"^ 2>/dev/null || echo "")
|
||||||
if [[ -n "$PREV_TAG" ]]; then
|
if [[ -n "$PREV_TAG" ]]; then
|
||||||
echo "Generating changelog from $PREV_TAG to $TAG_NAME"
|
|
||||||
COMMITS=$(git log "$PREV_TAG..$TAG_NAME" --pretty=format:"%s (%an)" --no-merges)
|
COMMITS=$(git log "$PREV_TAG..$TAG_NAME" --pretty=format:"%s (%an)" --no-merges)
|
||||||
else
|
else
|
||||||
echo "No previous tag found, generating changelog from initial commit"
|
|
||||||
COMMITS=$(git log --pretty=format:"%s (%an)" --no-merges)
|
COMMITS=$(git log --pretty=format:"%s (%an)" --no-merges)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Group commits by type
|
|
||||||
CHANGELOG=""
|
CHANGELOG=""
|
||||||
append_section() {
|
append_section() {
|
||||||
local TYPE="$1"
|
local TYPE="$1"
|
||||||
@@ -53,62 +47,40 @@ append_section() {
|
|||||||
local EMOJI="$3"
|
local EMOJI="$3"
|
||||||
local MATCHED=$(echo "$COMMITS" | grep -E "^${TYPE}: " || true)
|
local MATCHED=$(echo "$COMMITS" | grep -E "^${TYPE}: " || true)
|
||||||
if [[ -n "$MATCHED" ]]; then
|
if [[ -n "$MATCHED" ]]; then
|
||||||
CHANGELOG+="## $EMOJI $TITLE\\n"
|
CHANGELOG+="## $EMOJI $TITLE\n"
|
||||||
while IFS= read -r line; do
|
while IFS= read -r line; do
|
||||||
# Remove prefix (e.g., "feat: ")
|
|
||||||
local CLEANED=$(echo "$line" | sed -E "s/^${TYPE}: //")
|
local CLEANED=$(echo "$line" | sed -E "s/^${TYPE}: //")
|
||||||
CHANGELOG+="- $CLEANED\\n"
|
CHANGELOG+="- $CLEANED\n"
|
||||||
done <<< "$MATCHED"
|
done <<< "$MATCHED"
|
||||||
CHANGELOG+="\\n"
|
CHANGELOG+="\n"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
append_section "feat" "Features" "✨"
|
append_section "feat" "Features" "✨"
|
||||||
append_section "fix" "Fixes" "🐛"
|
append_section "fix" "Fixes" "🐛"
|
||||||
append_section "chore" "Chores" "🧹"
|
append_section "chore" "Chores" "🧹"
|
||||||
append_section "refactor" "Refactors" "🔧"
|
|
||||||
append_section "docs" "Documentation" "📝"
|
|
||||||
append_section "test" "Tests" "🧪"
|
|
||||||
append_section "style" "Style" "🎨"
|
|
||||||
append_section "ci" "CI/CD" "⚙️"
|
|
||||||
|
|
||||||
# Escape quotes for JSON
|
# Fallback if no commits found
|
||||||
CHANGELOG_ESCAPED=$(printf "%s" "$CHANGELOG" | sed 's/"/\\"/g')
|
[[ -z "$CHANGELOG" ]] && CHANGELOG="No commit history found."
|
||||||
|
|
||||||
RELEASE_BODY=""
|
|
||||||
|
|
||||||
|
# Inject into manual changelog if available
|
||||||
|
MANUAL_SECTION=""
|
||||||
if [[ -f "CHANGELOG.md" ]]; then
|
if [[ -f "CHANGELOG.md" ]]; then
|
||||||
echo "Looking for manual changelog entry for $TAG_NAME..."
|
|
||||||
MANUAL_SECTION=$(awk "/^## \\[?$TAG_NAME\\]? /{flag=1; next} /^## /{flag=0} flag" CHANGELOG.md)
|
MANUAL_SECTION=$(awk "/^## \\[?$TAG_NAME\\]? /{flag=1; next} /^## /{flag=0} flag" CHANGELOG.md)
|
||||||
|
if [[ "$MANUAL_SECTION" == *"<!-- auto-changelog -->"* ]]; then
|
||||||
if [[ -n "$MANUAL_SECTION" ]]; then
|
MANUAL_SECTION=$(echo "$MANUAL_SECTION" | sed "s|<!-- auto-changelog -->|$CHANGELOG|")
|
||||||
echo "Manual entry found for $TAG_NAME"
|
|
||||||
|
|
||||||
if grep -q '<!-- auto-changelog -->' <<< "$MANUAL_SECTION"; then
|
|
||||||
echo "Injecting auto-changelog into manual entry"
|
|
||||||
FINAL_SECTION=$(sed "s|<!-- auto-changelog -->|$CHANGELOG|" <<< "$MANUAL_SECTION")
|
|
||||||
else
|
|
||||||
FINAL_SECTION="$MANUAL_SECTION"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Escape quotes and newlines
|
|
||||||
RELEASE_BODY=$(printf "%s" "$FINAL_SECTION" | sed ':a;N;$!ba;s/\n/\\n/g; s/"/\\"/g')
|
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Fallback to full auto-changelog
|
RELEASE_BODY="${MANUAL_SECTION:-$CHANGELOG}"
|
||||||
if [[ -z "$RELEASE_BODY" ]]; then
|
RELEASE_BODY_ESCAPED=$(printf "%s" "$RELEASE_BODY" | sed ':a;N;$!ba;s/\n/\\n/g; s/"/\\"/g')
|
||||||
echo "Using full auto-generated changelog"
|
|
||||||
RELEASE_BODY="$CHANGELOG_ESCAPED"
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
|
# Determine prerelease
|
||||||
IS_PRERELEASE="false"
|
IS_PRERELEASE="false"
|
||||||
if [[ "$TAG_NAME" =~ -[0-9A-Za-z] ]]; then
|
[[ "$TAG_NAME" =~ -[0-9A-Za-z] ]] && IS_PRERELEASE="true"
|
||||||
IS_PRERELEASE="true"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Creating release $TAG_NAME (prerelease: $IS_PRERELEASE)..."
|
# 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" \
|
RELEASE_JSON=$(curl -sS -X POST "$RELEASE_ENDPOINT" \
|
||||||
-H "Authorization: token $GITEA_TOKEN" \
|
-H "Authorization: token $GITEA_TOKEN" \
|
||||||
@@ -119,13 +91,12 @@ RELEASE_JSON=$(curl -sS -X POST "$RELEASE_ENDPOINT" \
|
|||||||
"name": "$TAG_NAME",
|
"name": "$TAG_NAME",
|
||||||
"draft": false,
|
"draft": false,
|
||||||
"prerelease": $IS_PRERELEASE,
|
"prerelease": $IS_PRERELEASE,
|
||||||
"body": "$RELEASE_BODY"
|
"body": "$RELEASE_BODY_ESCAPED"
|
||||||
}
|
}
|
||||||
EOF
|
EOF
|
||||||
)
|
)
|
||||||
|
|
||||||
UPLOAD_URL=$(echo "$RELEASE_JSON" | jq -r '.upload_url // .assets_url')
|
UPLOAD_URL=$(echo "$RELEASE_JSON" | jq -r '.upload_url // .assets_url')
|
||||||
|
|
||||||
for file in "$TMPDIR"/*; do
|
for file in "$TMPDIR"/*; do
|
||||||
FILENAME=$(basename "$file")
|
FILENAME=$(basename "$file")
|
||||||
echo "Uploading $FILENAME..."
|
echo "Uploading $FILENAME..."
|
||||||
|
@@ -1,5 +1,14 @@
|
|||||||
name: Version Check & Tag
|
name: Version Check & Tag
|
||||||
description: Ensures version correctness and creates missing git tags
|
description: Ensures version correctness and creates missing git tags
|
||||||
runs:
|
runs:
|
||||||
using: "docker"
|
using: "composite"
|
||||||
image: git.cyborggrizzly.com/BearMetal/ci-actions/version-check:latest
|
steps:
|
||||||
|
- name: Set up Deno
|
||||||
|
uses: denoland/setup-deno@v1
|
||||||
|
with:
|
||||||
|
deno-version: 2.3.1
|
||||||
|
|
||||||
|
- name: Run version check
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
deno run --allow-read --allow-run --allow-write --allow-env https://git.cyborggrizzly.com/bearmetal/ci-actions/raw/branch/main/version-check/main.ts
|
||||||
|
@@ -7,6 +7,7 @@ if (!version) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const branch = Deno.env.get("GITHUB_REF")?.replace("refs/heads/", "") ?? "";
|
const branch = Deno.env.get("GITHUB_REF")?.replace("refs/heads/", "") ?? "";
|
||||||
|
console.log(`Branch: ${branch}`);
|
||||||
if (branch.startsWith("prerelease-")) {
|
if (branch.startsWith("prerelease-")) {
|
||||||
const suffix = branch.replace("prerelease-", "");
|
const suffix = branch.replace("prerelease-", "");
|
||||||
const base = version.split("-")[0];
|
const base = version.split("-")[0];
|
||||||
@@ -28,13 +29,32 @@ if (branch.startsWith("prerelease-")) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const tag = `v${version}`;
|
const tag = `v${version}`;
|
||||||
|
let created = true;
|
||||||
try {
|
try {
|
||||||
await run("git", ["rev-parse", tag]);
|
await run("git", ["rev-parse", tag]);
|
||||||
console.log(`Tag ${tag} already exists.`);
|
console.log(`Tag ${tag} already exists.`);
|
||||||
|
created = false;
|
||||||
} catch {
|
} catch {
|
||||||
await run("git", ["tag", tag]);
|
await run("git", ["tag", tag]);
|
||||||
await run("git", ["push", "origin", tag]);
|
await run("git", ["push", "origin", tag]);
|
||||||
}
|
}
|
||||||
|
if (created) {
|
||||||
|
const out = Deno.env.get("GITHUB_OUTPUT");
|
||||||
|
if (out) {
|
||||||
|
await Deno.writeTextFile(out, `tag_created=true\ntag_name=${tag}\n`, {
|
||||||
|
append: true,
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
console.error("GITHUB_OUTPUT not set.");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const out = Deno.env.get("GITHUB_OUTPUT");
|
||||||
|
if (out) {
|
||||||
|
await Deno.writeTextFile(out, `tag_created=false\n`, { append: true });
|
||||||
|
} else {
|
||||||
|
console.error("GITHUB_OUTPUT not set.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async function run(cmd: string, args: string[]) {
|
async function run(cmd: string, args: string[]) {
|
||||||
const command = new Deno.Command(cmd, {
|
const command = new Deno.Command(cmd, {
|
||||||
|
Reference in New Issue
Block a user