mirror of
https://github.com/jesseduffield/lazygit.git
synced 2026-01-09 06:21:15 +08:00
Of course it would be cooler if the workflow could create the PR and merge it if necessary, but this will have to do for now.
161 lines
4.9 KiB
YAML
161 lines
4.9 KiB
YAML
name: Release
|
|
|
|
on:
|
|
schedule:
|
|
# Runs at 8:00 AM UTC on every Saturday
|
|
# We'll check below if it's the first Saturday of the month, and fail if not
|
|
- cron: '0 8 * * 6'
|
|
# Allow manual triggering of the workflow
|
|
workflow_dispatch:
|
|
inputs:
|
|
version_bump:
|
|
description: 'Version bump type'
|
|
type: choice
|
|
required: true
|
|
default: 'patch'
|
|
options:
|
|
- minor
|
|
- patch
|
|
ignore_blocks:
|
|
description: 'Ignore blocking PRs/issues'
|
|
type: boolean
|
|
required: true
|
|
default: false
|
|
|
|
defaults:
|
|
run:
|
|
shell: bash
|
|
|
|
jobs:
|
|
check-and-release:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Check for correct repository
|
|
if: ${{ github.event_name != 'workflow_dispatch' && github.repository != 'stefanhaller/lazygit' }}
|
|
run: |
|
|
echo "Should only run in the stefanhaller/lazygit repository"
|
|
exit 1
|
|
|
|
- name: Check for first Saturday of the month
|
|
if: ${{ github.event_name != 'workflow_dispatch' }}
|
|
run: |
|
|
if (( $(date +%e) > 7 )); then
|
|
echo "This is not the first Saturday of the month"
|
|
exit 1
|
|
fi
|
|
|
|
- name: Checkout Code
|
|
uses: actions/checkout@v4
|
|
with:
|
|
repository: jesseduffield/lazygit
|
|
token: ${{ secrets.LAZYGIT_RELEASE_PAT }}
|
|
fetch-depth: 0
|
|
|
|
- name: Get Latest Tag
|
|
run: |
|
|
latest_tag=$(git describe --tags $(git rev-list --tags --max-count=1) || echo "v0.0.0")
|
|
|
|
if ! [[ $latest_tag =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
|
echo "Error: Tag format is invalid. Expected format: vX.X.X"
|
|
exit 1
|
|
fi
|
|
|
|
echo "Latest tag: $latest_tag"
|
|
echo "latest_tag=$latest_tag" >> $GITHUB_ENV
|
|
|
|
- name: Check for changes since last release
|
|
run: |
|
|
if [ -z "$(git diff --name-only ${{ env.latest_tag }})" ]; then
|
|
echo "No changes detected since last release"
|
|
exit 1
|
|
fi
|
|
|
|
- name: Check that docs and schema are up to date
|
|
run: |
|
|
if diff -r -q docs docs-master > /dev/null && diff -r -q schema schema-master > /dev/null; then
|
|
echo "Docs and schema are up to date."
|
|
else
|
|
echo "Docs or schema are out of date. Please run 'scripts/update_docs_for_release.sh' and make a PR."
|
|
exit 1
|
|
fi
|
|
|
|
- name: Check for Blocking Issues/PRs
|
|
if: ${{ !inputs.ignore_blocks }}
|
|
id: check_blocks
|
|
run: |
|
|
gh auth setup-git
|
|
gh auth status
|
|
|
|
echo "Checking for blocking issues and PRs..."
|
|
|
|
# Check for blocking issues
|
|
blocking_issues=$(gh issue list -l blocks-release --json number,title --jq '.[] | "- \(.title) (#\(.number))"')
|
|
|
|
# Check for blocking PRs
|
|
blocking_prs=$(gh pr list -l blocks-release --json number,title --jq '.[] | "- \(.title) (#\(.number)) (PR)"')
|
|
|
|
# Combine the results
|
|
blocking_items="$blocking_issues"$'\n'"$blocking_prs"
|
|
|
|
# Remove empty lines
|
|
blocking_items=$(echo "$blocking_items" | grep . || true)
|
|
|
|
if [ -n "$blocking_items" ]; then
|
|
echo "Blocking issues/PRs detected:"
|
|
echo "$blocking_items"
|
|
exit 1
|
|
fi
|
|
env:
|
|
GITHUB_TOKEN: ${{ secrets.LAZYGIT_RELEASE_PAT }}
|
|
|
|
- name: Calculate next version
|
|
run: |
|
|
echo "Latest tag: ${{ env.latest_tag }}"
|
|
IFS='.' read -r major minor patch <<< "${{ env.latest_tag }}"
|
|
|
|
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
|
|
if [[ "${{ inputs.version_bump }}" == "patch" ]]; then
|
|
patch=$((patch + 1))
|
|
else
|
|
minor=$((minor + 1))
|
|
patch=0
|
|
fi
|
|
else
|
|
# Default behavior for scheduled runs
|
|
minor=$((minor + 1))
|
|
patch=0
|
|
fi
|
|
|
|
new_tag="$major.$minor.$patch"
|
|
|
|
if ! [[ $new_tag =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
|
echo "Error: New tag's format is invalid. Expected format: vX.X.X"
|
|
exit 1
|
|
fi
|
|
|
|
echo "New tag: $new_tag"
|
|
echo "new_tag=$new_tag" >> $GITHUB_ENV
|
|
|
|
- name: Create and Push Tag
|
|
run: |
|
|
git config user.name "github-actions[bot]"
|
|
git config user.email "github-actions[bot]@users.noreply.github.com"
|
|
git tag ${{ env.new_tag }} -a -m "Release ${{ env.new_tag }}"
|
|
git push origin ${{ env.new_tag }}
|
|
env:
|
|
GITHUB_TOKEN: ${{ secrets.LAZYGIT_RELEASE_PAT }}
|
|
|
|
- name: Setup Go
|
|
uses: actions/setup-go@v5
|
|
with:
|
|
go-version: 1.25.x
|
|
|
|
- name: Run goreleaser
|
|
uses: goreleaser/goreleaser-action@v6
|
|
with:
|
|
distribution: goreleaser
|
|
version: v2
|
|
args: release --clean
|
|
env:
|
|
GITHUB_TOKEN: ${{secrets.LAZYGIT_RELEASE_PAT}}
|