From 51e034c399a9e8b91036bf3e96134314e4096642 Mon Sep 17 00:00:00 2001 From: a8trejo Date: Tue, 10 Dec 2024 14:22:30 -0800 Subject: [PATCH] Adding openai generated releases working along changesets --- .../scripts/overwrite_changeset_changelog.py | 30 +++ .github/scripts/parse_changeset_changelog.py | 38 ++++ .github/workflows/changeset-ai-releases.yml | 191 ++++++++++++++++++ .github/workflows/code-qa.yml | 2 +- .github/workflows/marketplace-publish.yml | 1 + 5 files changed, 261 insertions(+), 1 deletion(-) create mode 100755 .github/scripts/overwrite_changeset_changelog.py create mode 100755 .github/scripts/parse_changeset_changelog.py create mode 100644 .github/workflows/changeset-ai-releases.yml diff --git a/.github/scripts/overwrite_changeset_changelog.py b/.github/scripts/overwrite_changeset_changelog.py new file mode 100755 index 0000000..507b298 --- /dev/null +++ b/.github/scripts/overwrite_changeset_changelog.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python3 + +import os + +GITHUB_OUTPUT = os.getenv("GITHUB_OUTPUT") +CHANGELOG_PATH = os.environ.get("CHANGELOG_PATH", "CHANGELOG.md") +VERSION = os.environ['VERSION'] +PREV_VERSION = os.environ.get("PREV_VERSION", "") +NEW_CONTENT = os.environ['NEW_CONTENT'] + +def overwrite_changelog_section(content: str): + # Find the section for the specified version + version_pattern = f"## {VERSION}\n" + print(f"latest version: {VERSION}") + notes_start_index = content.find(version_pattern) + len(version_pattern) + print(f"prev_version: {PREV_VERSION}") + prev_version_pattern = f"## {PREV_VERSION}\n" + notes_end_index = content.find(prev_version_pattern, notes_start_index) if PREV_VERSION and prev_version_pattern in content else len(content) + return content[:notes_start_index] + f"{NEW_CONTENT}\n" + content[notes_end_index:] + +with open(CHANGELOG_PATH, 'r') as f: + content = f.read() + +new_changelog = overwrite_changelog_section(content) + +print(new_changelog) + +# Write back to CHANGELOG.md +with open(CHANGELOG_PATH, 'w') as f: + f.write(new_changelog) diff --git a/.github/scripts/parse_changeset_changelog.py b/.github/scripts/parse_changeset_changelog.py new file mode 100755 index 0000000..a5564ab --- /dev/null +++ b/.github/scripts/parse_changeset_changelog.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python3 + +import sys +import os +import subprocess + +GITHUB_OUTPUT = os.getenv("GITHUB_OUTPUT") +CHANGELOG_PATH = os.environ.get("CHANGELOG_PATH", "CHANGELOG.md") +VERSION = os.environ['VERSION'] + +def parse_changelog_section(content: str): + """Parse a specific version section from the changelog content. + + Returns: The formatted content for this version, or None if version not found + """ + # Find the section for the specified version + version_pattern = f"## {VERSION}\n" + print(f"latest version: {VERSION}") + notes_start_index = content.find(version_pattern) + len(version_pattern) + prev_version = subprocess.getoutput("git show origin/main:package.json | grep '\"version\":' | cut -d'\"' -f4") + print(f"prev_version: {prev_version}") + prev_version_pattern = f"## {prev_version}\n" + notes_end_index = content.find(prev_version_pattern, notes_start_index) if prev_version_pattern in content else len(content) + + return content[notes_start_index:notes_end_index] + +with open(CHANGELOG_PATH, 'r') as f: + content = f.read() + +formatted_content = parse_changelog_section(content) +if not formatted_content: + print(f"Version {VERSION} not found in changelog", file=sys.stderr) + sys.exit(1) + +print(formatted_content) + +with open(GITHUB_OUTPUT, "a") as gha_output: + gha_output.write(f"release-notes< + github.event_name == 'pull_request' && + github.event.pull_request.merged == true && + github.event.pull_request.base.ref == 'main' && + github.actor != 'R00-B0T' + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + steps: + - name: Git Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + ref: ${{ env.GIT_REF }} + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: 'npm' + + - name: Install Dependencies + run: npm install + + - name: Check for changesets + id: check-changesets + run: | + NEW_CHANGESETS=$(find .changeset -name "*.md" ! -name "README.md" | wc -l | tr -d ' ') + echo "Changesets diff with previous version: $NEW_CHANGESETS" + echo "new_changesets=$NEW_CHANGESETS" >> $GITHUB_OUTPUT + + - name: Changeset Pull Request + if: steps.check-changesets.outputs.new_changesets != '0' + id: changesets + uses: changesets/action@v1 + with: + commit: "changeset version bump" + title: "Changeset version bump" + version: npm run version-packages # This performs the changeset version bump + env: + GITHUB_TOKEN: ${{ secrets.ROO_GITHUB_TOKEN }} + + changeset-pr-approve-merge: + name: Auto approve and merge Bump version PRs + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + if: > + github.event_name == 'pull_request' && + github.event.pull_request.base.ref == 'main' && + github.actor == 'R00-B0T' && + contains(github.event.pull_request.title, 'Changeset version bump') + + steps: + - name: Checkout Repo + uses: actions/checkout@v4 + with: + token: ${{ secrets.ROO_GITHUB_TOKEN }} + fetch-depth: 0 + ref: ${{ env.GIT_REF }} + + - name: Get version + id: get_version + run: | + VERSION=$(git show HEAD:package.json | jq -r '.version') + echo "version=$VERSION" >> $GITHUB_OUTPUT + PREV_VERSION=$(git show origin/main:package.json | jq -r '.version') + echo "prev_version=$PREV_VERSION" >> $GITHUB_OUTPUT + + echo "version=$VERSION" + echo "prev_version=$PREV_VERSION" + + # Github outputs: 'RELEASE_NOTES' and 'OPENAI_PROMPT' + - name: AI Release Notes + if: ${{ !contains(github.event.pull_request.labels.*.name, 'openai-edited') }} + uses: RooVetGit/Roo-GHA/.github/actions/ai-release-notes@main + id: ai_release_notes + with: + GHA_PAT: ${{ secrets.ROO_GITHUB_TOKEN }} + OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} + model_name: gpt-4o-mini + repo_path: ${{ env.REPO_PATH }} + git_ref: ${{ env.GIT_REF }} + + - name: Update Changeset Changelog + if: ${{ !contains(github.event.pull_request.labels.*.name, 'openai-edited') }} + env: + VERSION: ${{ steps.get_version.outputs.version }} + PREV_VERSION: ${{ steps.get_version.outputs.prev_version }} + NEW_CONTENT: ${{ steps.ai_release_notes.outputs.RELEASE_NOTES }} + run: python .github/scripts/overwrite_changeset_changelog.py + + - name: Push Changelog updates + if: ${{ !contains(github.event.pull_request.labels.*.name, 'openai-edited') }} + run: | + git config user.name "R00-B0T" + git config user.email github-actions@github.com + git status + + echo "Updating changelog.md..." + git add CHANGELOG.md + git commit -m "Updating changeset changelog" + + echo "--------------------------------------------------------------------------------" + echo "Pushing to remote..." + echo "--------------------------------------------------------------------------------" + git push + + - name: Add openai-edited label + if: ${{ !contains(github.event.pull_request.labels.*.name, 'openai-edited') }} + uses: actions/github-script@v7 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + await github.rest.issues.addLabels({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + labels: ['openai-edited'] + }); + + - name: Auto approve PR + if: contains(github.event.pull_request.labels.*.name, 'openai-edited') + uses: hmarr/auto-approve-action@v4 + with: + review-message: "I'm approving since it's a bump version PR" + + - name: Enable automerge on PR + if: contains(github.event.pull_request.labels.*.name, 'openai-edited') + run: gh pr merge --squash --auto ${{ github.event.pull_request.number }} + env: + GH_TOKEN: ${{ secrets.ROO_GITHUB_TOKEN }} + + github-release: + runs-on: ubuntu-latest + if: > + github.event_name == 'pull_request' && + github.event.pull_request.merged == true && + github.event.pull_request.base.ref == 'main' && + github.actor == 'R00-B0T' && + contains(github.event.pull_request.title, 'Changeset version bump') + permissions: + contents: write + steps: + - name: Checkout Repo + uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.head.sha }} + fetch-depth: 0 + + - name: Get version + id: get_version + run: | + VERSION=$(git show HEAD:package.json | jq -r '.version') + echo "version=$VERSION" >> $GITHUB_OUTPUT + + # Outputs: 'release-notes' + - name: Parse CHANGELOG.md + id: changelog + env: + CHANGELOG_PATH: CHANGELOG.md + VERSION: ${{ steps.get_version.outputs.version }} + run: python .github/scripts/parse_changeset_changelog.py + + - name: Create or Update Release + uses: softprops/action-gh-release@v2 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: v${{ steps.get_version.outputs.version }} + name: Release v${{ steps.get_version.outputs.version }} + draft: false + prerelease: false + append_body: false + make_latest: true + body: ${{ steps.changelog.outputs.release-notes }} diff --git a/.github/workflows/code-qa.yml b/.github/workflows/code-qa.yml index 44a7010..0a5f3c1 100644 --- a/.github/workflows/code-qa.yml +++ b/.github/workflows/code-qa.yml @@ -8,7 +8,7 @@ on: branches: [main] jobs: - code-qa: + compile: runs-on: ubuntu-latest steps: - name: Checkout code diff --git a/.github/workflows/marketplace-publish.yml b/.github/workflows/marketplace-publish.yml index fdc35cc..5f99b44 100644 --- a/.github/workflows/marketplace-publish.yml +++ b/.github/workflows/marketplace-publish.yml @@ -7,6 +7,7 @@ on: jobs: publish-extension: runs-on: ubuntu-latest + if: ${{ github.actor == 'R00-B0T'}} steps: - uses: actions/checkout@v3 - uses: actions/setup-node@v3