Skip to content

Merge pull request #4379 from serlo/math-renderer-sanitize-html #808

Merge pull request #4379 from serlo/math-renderer-sanitize-html

Merge pull request #4379 from serlo/math-renderer-sanitize-html #808

name: Generate Editor Changelog
on:
push:
branches:
- '**' # Runs on all branches
jobs:
generate-editor-changelog:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: 20
- name: Install dependencies
run: yarn
- name: Get current version of editor package
id: get_local_version
run: |
CURRENT_VERSION=$(node -p "require('./packages/editor/package.json').version")
echo "CURRENT_VERSION=$CURRENT_VERSION" >> $GITHUB_ENV
- name: Check if changelog for this version already exists
id: check_existing_changelog
run: |
if [ -f packages/editor/CHANGELOG.md ] && grep -q "## Changelog for version $CURRENT_VERSION" packages/editor/CHANGELOG.md; then
echo "changelog_exists=true" >> $GITHUB_ENV
else
echo "changelog_exists=false" >> $GITHUB_ENV
fi
- name: Get latest published version from npm
if: env.changelog_exists == 'false'
id: get_npm_version
run: |
NPM_VERSION=$(npm view @serlo/editor version)
echo "NPM_VERSION=$NPM_VERSION" >> $GITHUB_ENV
- name: Check if version has changed
if: env.changelog_exists == 'false'
id: check_version
run: |
if [ "$CURRENT_VERSION" != "$NPM_VERSION" ]; then
echo "version_changed=true" >> $GITHUB_ENV
else
echo "version_changed=false" >> $GITHUB_ENV
fi
- name: Stop if version has not changed
if: env.version_changed == 'false'
run: exit 0
- name: Get last tag for editor package (if available)
if: env.version_changed == 'true'
id: get_last_tag
run: |
git fetch --all --tags
LAST_TAG=$(git tag -l "v*-editor" | sort -V | tail -n 1 || echo "none")
if [ "$LAST_TAG" == "none" ]; then
echo "No previous tag found, this is the first release"
echo "LAST_TAG=" >> $GITHUB_ENV
else
echo "Found tag: $LAST_TAG"
echo "LAST_TAG=$LAST_TAG" >> $GITHUB_ENV
fi
- name: Check if there are changes in packages/editor since last tag
if: env.version_changed == 'true'
id: check_editor_changes
run: |
if [ -z "$LAST_TAG" ]; then
# No previous tag, assume all changes in editor are new
echo "no_editor_changes=false" >> $GITHUB_ENV
else
# Compare changes since the last tag
CHANGED_FILES=$(git diff --name-only $LAST_TAG HEAD -- packages/editor)
if [ -z "$CHANGED_FILES" ]; then
echo "no_editor_changes=true" >> $GITHUB_ENV
else
echo "no_editor_changes=false" >> $GITHUB_ENV
fi
fi
- name: Stop if no changes in packages/editor
if: env.no_editor_changes == 'true'
run: exit 0
- name: Get merged PRs affecting editor package (last 50 if no tag)
if: env.version_changed == 'true' && env.no_editor_changes == 'false'
id: get_prs
run: |
if [ -z "$LAST_TAG" ]; then
# No tag, get last 50 PRs
PRS=$(curl -s "https://api.github.com/repos/serlo/frontend/pulls?state=closed&per_page=50" | jq -r '.[] | .number' | tr '\n' ' ')
else
# Get the commit date of the last tag
TAG_DATE=$(git log -1 --format=%aI $LAST_TAG)
# Fetch PRs since tag commit date
PRS=$(curl -s "https://api.github.com/repos/serlo/frontend/pulls?state=closed&per_page=100" | \
jq -r --arg TAG_DATE "$TAG_DATE" \
'.[] | select(.merged_at != null and .merged_at > $TAG_DATE and .head.repo.full_name == "serlo/frontend") | .number' | \
tr '\n' ' ')
fi
echo "PR_NUMBERS=$PRS" >> $GITHUB_ENV
- name: Get PR titles that touched editor folder
if: env.version_changed == 'true' && env.no_editor_changes == 'false'
id: get_pr_titles
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
PR_TITLES=""
IFS=' ' read -r -a PR_ARRAY <<< "$PR_NUMBERS"
echo "Processing ${#PR_ARRAY[@]} PRs"
for pr in "${PR_ARRAY[@]}"; do
echo "Checking PR #$pr"
PR_DATA=$(curl -s -H "Authorization: token $GH_TOKEN" "https://api.github.com/repos/${{ github.repository }}/pulls/$pr")
if [ $? -ne 0 ]; then
echo "Error fetching PR data for #$pr"
continue
fi
MERGED=$(echo "$PR_DATA" | jq -r '.merged')
if [ "$MERGED" != "true" ]; then
echo "PR #$pr was not merged, skipping"
continue
fi
FILES=$(curl -s -H "Authorization: token $GH_TOKEN" "https://api.github.com/repos/${{ github.repository }}/pulls/$pr/files")
if [ $? -ne 0 ]; then
echo "Error fetching files for PR #$pr"
continue
fi
if echo "$FILES" | jq -r '.[].filename' | grep -q "^packages/editor/"; then
PR_TITLE=$(echo "$PR_DATA" | jq -r '.title')
PR_URL=$(echo "$PR_DATA" | jq -r '.html_url')
PR_AUTHOR=$(echo "$PR_DATA" | jq -r '.user.login')
echo "PR #$pr touches editor package. Title: $PR_TITLE"
PR_TITLES="${PR_TITLES}- ${PR_TITLE}. Thank you [@${PR_AUTHOR}](https://github.com/${PR_AUTHOR}) in ${PR_URL}\n"
else
echo "PR #$pr does not touch editor package"
fi
done
echo "Final PR_TITLES: $PR_TITLES"
if [ -n "$PR_TITLES" ]; then
# Escape special characters and set PR_TITLES as an environment variable
escaped_titles=$(printf '%s\n' "$PR_TITLES" | sed -e 's/"/\\"/g' -e 's/!/\\!/g')
echo "PR_TITLES<<EOF" >> $GITHUB_ENV
echo "$escaped_titles" >> $GITHUB_ENV
echo "EOF" >> $GITHUB_ENV
else
echo "PR_TITLES=No relevant PRs found" >> $GITHUB_ENV
fi
shell: bash
- name: Generate Changelog
if: env.version_changed == 'true' && env.no_editor_changes == 'false' && env.PR_TITLES != 'No relevant PRs found'
run: |
# Create temporary file with new changelog
echo "## Changelog for version $CURRENT_VERSION" > temp_changelog.md
echo "" >> temp_changelog.md
echo -e "$PR_TITLES" >> temp_changelog.md
echo "" >> temp_changelog.md
if [ -n "$LAST_TAG" ]; then
echo "**Full Changelog**: https://github.com/${{ github.repository }}/compare/${LAST_TAG}...v${CURRENT_VERSION}-editor" >> temp_changelog.md
else
echo "**Full Changelog**: https://github.com/${{ github.repository }}/compare/v${NPM_VERSION}-editor...v${CURRENT_VERSION}-editor" >> temp_changelog.md
fi
echo "" >> temp_changelog.md || exit 1
# Combine new changelog with existing one (if it exists)
if [ -f packages/editor/CHANGELOG.md ]; then
cat packages/editor/CHANGELOG.md >> temp_changelog.md
fi
# Replace old changelog with combined version
mv temp_changelog.md packages/editor/CHANGELOG.md
- name: Run Prettier on Changelog
if: env.version_changed == 'true' && env.no_editor_changes == 'false' && env.PR_TITLES != 'No relevant PRs found'
run: yarn prettier -w packages/editor/CHANGELOG.md
- name: Commit and Push Changelog
if: env.version_changed == 'true' && env.no_editor_changes == 'false' && env.PR_TITLES != 'No relevant PRs found'
run: |
git config --local user.email "41898282+github-actions[bot]@users.noreply.github.com"
git config --local user.name "GitHub Action Bot"
git add packages/editor/CHANGELOG.md
git commit -m "chore: update changelog for version $CURRENT_VERSION"
git push origin ${{ github.ref_name }}