Skip to content

Manual Plugin Release #29

Manual Plugin Release

Manual Plugin Release #29

name: Manual Plugin Release
on:
workflow_dispatch:
inputs:
increment:
description: "Version increment type"
required: true
type: choice
options:
- patch
- minor
- major
default: "patch"
jobs:
check_release:
runs-on: ubuntu-latest
outputs:
is_releasing: ${{ steps.check.outputs.is_releasing }}
steps:
- id: check
name: Check for running release workflows
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
running=$(gh api /repos/${{ github.repository }}/actions/runs \
--jq '.workflow_runs[] | select(.status=="in_progress" and (.name=="Release Obsidian Plugin" or .name=="Manual Plugin Release")) | .id' \
| wc -l)
if [ "$running" -gt "1" ]; then
echo "is_releasing=true" >> $GITHUB_OUTPUT
echo "::error::A release is already in progress. Please wait for it to complete."
exit 1
else
echo "is_releasing=false" >> $GITHUB_OUTPUT
fi
release:
needs: check_release
if: needs.check_release.outputs.is_releasing != 'true'
runs-on: ubuntu-latest
steps:
- name: Check out repository
uses: actions/checkout@v3
with:
fetch-depth: 0
token: ${{ secrets.GITHUB_TOKEN }}
- name: Use Node.js
uses: actions/setup-node@v3
with:
node-version: "18.x"
- name: Install pnpm
uses: pnpm/action-setup@v2
with:
version: 8
- name: Get pnpm store directory
id: pnpm-cache
shell: bash
run: |
echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
- name: Setup pnpm cache
uses: actions/cache@v3
with:
path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
- name: Install dependencies
run: pnpm install
- name: Configure Git
run: |
git config --global user.name "github-actions[bot]"
git config --global user.email "github-actions[bot]@users.noreply.github.com"
- name: Update versions and generate artifacts
id: release_prep
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
run: |
# Build all packages including release-notes
echo "Building packages..."
pnpm build --filter "@file-organizer/release-notes"
# Create a temporary file for the release data
echo "Preparing release data..."
node -e "
const { updateVersions, generateReleaseArtifacts, prepareReleaseArtifacts, generateReleaseNotes } = require('./packages/release-notes/dist');
async function run() {
try {
const repoRoot = process.cwd();
// Step 1: Update versions
console.log('Updating versions...');
const versionInfo = await updateVersions('${{ github.event.inputs.increment }}', repoRoot);
console.log('Version info:', JSON.stringify(versionInfo));
// Step 2: Build plugin and prepare directory
console.log('Building plugin...');
await generateReleaseArtifacts(versionInfo.previous, {
repoRoot,
openAIApiKey: process.env.OPENAI_API_KEY
});
// Step 3: Generate release notes
console.log('Generating release notes...');
const notes = await generateReleaseNotes(versionInfo.previous, {
repoRoot,
openAIApiKey: process.env.OPENAI_API_KEY
});
// Step 4: Prepare artifacts and generate checksums
console.log('Preparing artifacts...');
const artifacts = await prepareReleaseArtifacts(versionInfo.new);
console.log('Generated artifacts:', artifacts);
// Write the complete release data to a file
const releaseData = { versionInfo, notes };
require('fs').writeFileSync('release-data.json', JSON.stringify(releaseData, null, 2));
console.log('Release data written to release-data.json');
} catch (error) {
console.error('Error during release preparation:', error);
process.exit(1);
}
}
run().catch(error => {
console.error('Fatal error:', error);
process.exit(1);
});
"
# Check if release-data.json exists
if [ ! -f "release-data.json" ]; then
echo "Error: release-data.json was not created"
exit 1
fi
# Export the release data to GITHUB_ENV
echo "RELEASE_DATA<<EOF" >> $GITHUB_ENV
cat release-data.json >> $GITHUB_ENV
echo "EOF" >> $GITHUB_ENV
- name: Push changes
run: git push origin HEAD
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Verify artifacts
run: |
# Check if required files exist
for file in main.js styles.css manifest.json checksums.txt; do
if [ ! -f "release-artifacts/$file" ]; then
echo "Error: release-artifacts/$file is missing"
exit 1
fi
done
- name: Create Release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
# Parse release data
VERSION=$(cat release-data.json | jq -r '.versionInfo.new')
RELEASE_NAME=$(cat release-data.json | jq -r '.notes.name')
RELEASE_DESC=$(cat release-data.json | jq -r '.notes.description')
TECHNICAL_CHANGES=$(cat release-data.json | jq -r '.notes.technicalChanges | join("\n- ")')
# Verify all required variables
if [ -z "$VERSION" ] || [ -z "$RELEASE_NAME" ] || [ -z "$RELEASE_DESC" ] || [ -z "$TECHNICAL_CHANGES" ]; then
echo "Error: Missing required release information"
exit 1
fi
# Create release notes markdown
{
echo "# $RELEASE_NAME"
echo ""
echo "$RELEASE_DESC"
echo ""
echo "## Technical Changes"
echo "- $TECHNICAL_CHANGES"
echo ""
echo "## SHA-256 Checksums"
cat release-artifacts/checksums.txt
} > release-notes.md
# Verify release notes were created
if [ ! -f "release-notes.md" ]; then
echo "Error: Failed to create release notes"
exit 1
fi
# Create the GitHub release
gh release create "$VERSION" \
--title="$RELEASE_NAME" \
--notes-file=release-notes.md \
--draft=false \
release-artifacts/main.js \
release-artifacts/styles.css \
release-artifacts/manifest.json \
release-artifacts/checksums.txt