diff --git a/.github/workflows/auto-merge-release.yml b/.github/workflows/auto-merge-release.yml index ef174d99..98aa95f2 100644 --- a/.github/workflows/auto-merge-release.yml +++ b/.github/workflows/auto-merge-release.yml @@ -2,8 +2,7 @@ name: auto-merge-release on: schedule: - # 10:00 UTC = 4am CST (winter) / 5am CDT (summer) - - cron: "0 10 * * 1" + - cron: "0 10 * * *" workflow_dispatch: permissions: {} @@ -16,11 +15,45 @@ jobs: merge: if: github.repository == 'jdx/usage' runs-on: ubuntu-latest + permissions: + contents: read steps: + - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + with: + fetch-depth: 0 + fetch-tags: true + persist-credentials: false - name: Merge release into main run: | set -euo pipefail + if [ "${GITHUB_EVENT_NAME:-}" != "workflow_dispatch" ]; then + latest_tag=$(git describe --tags --match 'v[0-9]*' --abbrev=0 || true) + if [ -n "$latest_tag" ]; then + range="${latest_tag}..HEAD" + tag_time=$(git for-each-ref --format='%(creatordate:unix)' "refs/tags/$latest_tag") + now=$(date +%s) + min_age=$((7 * 24 * 60 * 60)) + age=$((now - tag_time)) + if [ "$age" -lt "$min_age" ]; then + echo "Latest release ${latest_tag} is less than 7 days old; not auto-merging release PRs" + exit 0 + fi + else + echo "No v[0-9]* release tag found; allowing bootstrap release" + range="" + fi + if [ -n "$range" ]; then + commit_subjects=$(git log --format=%s "$range") + if ! grep -Eq '^(fix|feat)(\([^)]+\))?!?: ' <<<"$commit_subjects"; then + echo "No pending fix/feat commits since the latest release; not auto-merging release PRs" + exit 0 + fi + fi + else + echo "Manual dispatch; skipping release cadence guards" + fi + PR_NUMBER=$(gh pr list -R jdx/usage --base main --head release --state open --limit 100 --json number,headRefName,headRepositoryOwner \ --jq '[.[] | select(.headRefName == "release") | select(.headRepositoryOwner.login == "jdx")][0].number // empty') if [ -z "$PR_NUMBER" ]; then @@ -35,7 +68,7 @@ jobs: exit 0 fi - echo "PR #$PR_NUMBER is ready for the Monday morning release window" + echo "PR #$PR_NUMBER is ready for the daily release window" gh pr merge "$PR_NUMBER" -R jdx/usage --squash --auto env: GH_TOKEN: ${{ secrets.MY_RELEASE_PLEASE_TOKEN }}