Skip to content

feat(ci): implement automated CHANGELOG.md updates in release workflow #32

feat(ci): implement automated CHANGELOG.md updates in release workflow

feat(ci): implement automated CHANGELOG.md updates in release workflow #32

Workflow file for this run

name: Create Release
on:
push:
branches:
- main
- center-horizontally
workflow_dispatch:
permissions:
contents: write
jobs:
release:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0 # Fetch all history for all tags and branches
- name: Set up Lua
env:
ACTIONS_ALLOW_UNSECURE_COMMANDS: true
uses: leafo/gh-actions-lua@v2
with:
luaVersion: "5.1"
- name: Set up LuaRocks
uses: leafo/gh-actions-luarocks@v4
- name: Install dependencies for Lua
run: luarocks install busted
- name: Run Lua tests
run: |
if [ -d "spec" ]; then
busted
elif [ -d "tests" ]; then
busted tests
else
echo "No test directory found. Creating a sample test."
mkdir -p spec
echo "describe('Sample test', function() it('should pass', function() assert.is_true(true) end) end)" > spec/sample_spec.lua
busted
fi
- name: Set up Neovim
run: |
sudo add-apt-repository ppa:neovim-ppa/unstable -y
sudo apt-get update
sudo apt-get install -y neovim
- name: Set up Neovim configuration
run: |
mkdir -p ~/.config/nvim
echo 'require("lazy").setup({' > ~/.config/nvim/init.lua
echo ' "nvim-treesitter/nvim-treesitter",' >> ~/.config/nvim/init.lua
echo ' "nvim-lua/plenary.nvim",' >> ~/.config/nvim/init.lua
echo ' "lewis6991/gitsigns.nvim",' >> ~/.config/nvim/init.lua
echo '})' >> ~/.config/nvim/init.lua
nvim --headless -c 'quitall'
- name: Test horizontal scrolling
run: |
nvim --headless +'lua require("typewriter").setup({ enable_horizontal_scroll = true })' +'autocmd BufEnter * normal! zt' +'qall'
- name: Set up Lua environment
run: echo "${{ github.workspace }}/.lua/bin" >> $GITHUB_PATH
- name: Verify Lua installation
run: lua -v
- name: Determine next version
id: determine_version
run: |
git fetch --tags
LATEST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo 'v0.0.0')
echo "LATEST_TAG=${LATEST_TAG}" >> $GITHUB_OUTPUT
git log ${LATEST_TAG}..HEAD --pretty=format:%s > commits.txt
if grep -q '^BREAKING CHANGE:' commits.txt || grep -q '^[a-zA-Z]\+!:' commits.txt; then
BUMP="major"
elif grep -q '^feat:' commits.txt; then
BUMP="minor"
else
BUMP="patch"
fi
echo "BUMP=${BUMP}" >> $GITHUB_OUTPUT
LATEST_VERSION=${LATEST_TAG#v}
IFS='.' read -ra VERSION_PARTS <<< "$LATEST_VERSION"
MAJOR=${VERSION_PARTS[0]:-0}
MINOR=${VERSION_PARTS[1]:-0}
PATCH=${VERSION_PARTS[2]:-0}
case $BUMP in
major)
NEW_VERSION="$((MAJOR + 1)).0.0"
;;
minor)
NEW_VERSION="${MAJOR}.$((MINOR + 1)).0"
;;
patch)
NEW_VERSION="${MAJOR}.${MINOR}.$((PATCH + 1))"
;;
esac
echo "NEW_VERSION=v${NEW_VERSION}" >> $GITHUB_OUTPUT
# Check if the calculated version already exists
if git rev-parse v$NEW_VERSION >/dev/null 2>&1; then
echo "Version v$NEW_VERSION already exists. Incrementing patch version."
PATCH=$((PATCH + 1))
NEW_VERSION="${MAJOR}.${MINOR}.${PATCH}"
echo "NEW_VERSION=v${NEW_VERSION}" >> $GITHUB_OUTPUT
fi
- name: Generate Changelog
id: get_changelog
run: |
LATEST_TAG=${{ steps.determine_version.outputs.LATEST_TAG }}
CHANGELOG=$(git log ${LATEST_TAG}..HEAD --pretty=format:"- %s")
echo "CHANGELOG<<EOF" >> $GITHUB_OUTPUT
echo "$CHANGELOG" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
- name: Update CHANGELOG.md
run: |
NEW_VERSION=${{ steps.determine_version.outputs.NEW_VERSION }}
CHANGELOG=${{ steps.get_changelog.outputs.CHANGELOG }}
# Prepend new changes to CHANGELOG.md
echo -e "# $NEW_VERSION\n\n$CHANGELOG\n\n$(cat CHANGELOG.md)" > CHANGELOG.md
# Commit and push the updated CHANGELOG.md
git config --local user.email "action@github.com"
git config --local user.name "GitHub Action"
git add CHANGELOG.md
git commit -m "docs: update CHANGELOG.md for $NEW_VERSION"
git push
- name: Create GitHub Release
id: create_release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ steps.determine_version.outputs.NEW_VERSION }}
release_name: Release ${{ steps.determine_version.outputs.NEW_VERSION }}
body: |
## Changes in this Release
${{ steps.get_changelog.outputs.CHANGELOG }}
For full changelog, see [CHANGELOG.md](https://github.com/joshuadanpeterson/typewriter.nvim/blob/main/CHANGELOG.md)
## Core Features
- Keeps the cursor centered on the screen while typing or navigating.
- Simple commands to enable, disable, and toggle the typewriter mode.
- Integrates with ZenMode and True Zen for a seamless distraction-free environment.
For more details, please check the [README](https://github.com/joshuadanpeterson/typewriter.nvim/blob/main/README.md).
draft: false
prerelease: false