Skip to content

DEPLOY

DEPLOY #12

Workflow file for this run

name: DEPLOY # Package, release, publish
on:
workflow_dispatch: # allows manual trigger
push:
branches:
- main # runs only after code is merged into main
jobs:
deploy:
runs-on: ubuntu-latest
environment: PROD
# Run only if commit message starts with "release:"
# Or manually run
if: >
startsWith(github.event.head_commit.message, 'release:') ||
github.event_name == 'workflow_dispatch'
steps:
- name: Checkout repository
uses: actions/checkout@v5
- name: Read manifest and package extension
run: |
EXT_VERSION=$(grep -E '^version\s*=' ${{ vars.EXTENSION_SRC }}/blender_manifest.toml \
| sed -E 's/^version\s*=\s*"(.*)"/\1/' \
| tr -d '\r\n')
EXT_ID=$(grep -E '^id\s*=' "${{ vars.EXTENSION_SRC }}/blender_manifest.toml" \
| sed -E 's/^id\s*=\s*"(.*)"/\1/' \
| tr -d '\r\n')
BLENDER_MIN_VERSION=$(grep -E '^blender_version_min\s*=' "${{ vars.EXTENSION_SRC }}/blender_manifest.toml" \
| sed -E 's/^blender_version_min\s*=\s*"(.*)"/\1/' \
| tr -d '\r\n')
ZIP_NAME="$EXT_ID-$EXT_VERSION.zip"
COMMIT_HASH=$(git rev-parse --short HEAD)
RELEASE_TAG_NAME="v${EXT_VERSION}"
RELEASE_NAME="$RELEASE_TAG_NAME - Blender $BLENDER_MIN_VERSION+"
zip -r "$ZIP_NAME" ${{ vars.EXTENSION_SRC }}
SHA256=$(sha256sum "$ZIP_NAME" | awk '{ print $1 }')
echo "Version: $EXT_VERSION"
echo "ID: $EXT_ID"
echo "Packaged as: $ZIP_NAME"
echo "SHA256: $SHA256"
echo "TAG: $RELEASE_TAG_NAME"
echo "Release name: $RELEASE_NAME"
echo "ext_version=$EXT_VERSION" >> $GITHUB_ENV
echo "ext_id=$EXT_ID" >> $GITHUB_ENV
echo "ext_zip_name=$ZIP_NAME" >> $GITHUB_ENV
echo "commit_hash=$COMMIT_HASH" >> $GITHUB_ENV
echo "release_tag_name=$RELEASE_TAG_NAME" >> $GITHUB_ENV
echo "release_name=$RELEASE_NAME" >> $GITHUB_ENV
echo "sha256=$SHA256" >> $GITHUB_ENV
echo "blender_min_version=$BLENDER_MIN_VERSION" >> $GITHUB_ENV
- name: Deploy to Blender Extensions Platform API
env:
BLENDER_API_URL: https://extensions.blender.org/api/v1/extensions/${{ env.EXT_ID }}/versions/upload/
BLENDER_REFERER_URL: https://extensions.blender.org/add-ons/${{ env.EXT_ID }}/
run: |
# Extract release notes from CHANGELOG.md
RELEASE_NOTES=$(awk -v ver="${{ env.ext_version }}" '
$0 ~ "^## \\[" ver "\\]" {capture=1}
capture && NR>1 && /^## \[/ && $0 !~ "\\[" ver "\\]" {capture=0}
capture
' CHANGELOG.md)
if [ -z "$RELEASE_NOTES" ]; then
echo "Error: Release notes for version ${{ env.ext_version }} not found."
exit 1
fi
# Trim trailing spaces and replace newlines with \n
RELEASE_NOTES_ESCAPED=$(echo "$RELEASE_NOTES" | sed -e 's/[[:space:]]*$//' | awk '{printf "%s\\n", $0}')
RELEASE_NOTES_ESCAPED=${RELEASE_NOTES_ESCAPED%\\n}
# Send request and capture response + HTTP code
RESPONSE=$(curl -s -w "\nHTTP_STATUS:%{http_code}" -X POST "$BLENDER_API_URL" \
-H "Authorization:bearer ${{ secrets.BLENDER_EXTENSIONS_TOKEN }}" \
-H "Referer:$BLENDER_REFERER_URL" \
-F "version_file=@$ext_zip_name" \
-F "release_notes=$RELEASE_NOTES_ESCAPED")
# Split response body and HTTP code
HTTP_CODE=$(echo "$RESPONSE" | tail -n1 | sed 's/HTTP_STATUS://')
BODY=$(echo "$RESPONSE" | sed '$d')
echo "Blender Extensions Platform API response:"
echo "HTTP Status Code: $HTTP_CODE"
echo "Response Body: $BODY"
# Optional: fail the step if HTTP code is not 2xx
if [[ "$HTTP_CODE" -lt 200 || "$HTTP_CODE" -ge 300 ]]; then
echo "Error: Request failed with status $HTTP_CODE"
exit 1
fi
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ env.release_tag_name }}
name: "${{ env.release_name }}"
body: |
🚀 Automatic release for version **${{ env.ext_version }}**
🔖 Commit: `${{ env.commit_hash }}`
**SHA-256 checksum:** `${{ env.sha256 }}`
🧱 Recommended Blender version >= **${{ env.blender_min_version }}**
draft: false
prerelease: false
files: ${{ env.ext_zip_name }}
generate_release_notes: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}