-
Notifications
You must be signed in to change notification settings - Fork 10
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #4171 from serlo/chore/delete-change-sets-and-writ…
…e-custom-github-action-auto-generating-release-notes ci(editor): Write custom github action for generating changelog from PR names and throw out the changeset package
- Loading branch information
Showing
3 changed files
with
214 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,172 @@ | ||
name: Generate Editor Changelog | ||
|
||
on: | ||
push: | ||
branches: | ||
- '**' # Runs on all branches | ||
|
||
jobs: | ||
generate-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 describe --tags --match "v*-editor" --abbrev=0 2>/dev/null || echo "none") | ||
if [ "$LAST_TAG" == "none" ]; then | ||
echo "No previous tag found, this is the first release" | ||
echo "LAST_TAG=" >> $GITHUB_ENV | ||
else | ||
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 10 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 10 PRs | ||
PRS=$(curl -s "https://api.github.com/repos/serlo/frontend/pulls?state=closed&per_page=10" | jq -r '.[] | .number' | tr '\n' ' ') | ||
else | ||
# Fetch PRs since last tag | ||
PRS=$(curl -s "https://api.github.com/repos/serlo/frontend/pulls?state=closed&per_page=100" | jq -r '.[] | select(.merged_at != null and .merged_at > $GITHUB_ENV.LAST_TAG 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') | ||
echo "PR #$pr touches editor package. Title: $PR_TITLE" | ||
PR_TITLES="${PR_TITLES}- ${PR_TITLE}\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: | | ||
echo "## Changelog for version $CURRENT_VERSION" > packages/editor/CHANGELOG.md | ||
echo "" >> packages/editor/CHANGELOG.md # Adds a newline after the heading | ||
echo -e "$PR_TITLES" >> 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 }} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
## Changelog for version 0.15.4 | ||
|
||
- ci(fix): Only publish new version after PR gets merged | ||
- Ci/GitHub action creates pr with changeset | ||
- refactor: move experiments to editor | ||
- fix(plugin-rows): hydration error in anchor link copy tool | ||
- fix(exercise): update titles |