Просмотр исходного кода

Adding openai generated releases working along changesets

a8trejo 1 год назад
Родитель
Сommit
51e034c399

+ 30 - 0
.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)

+ 38 - 0
.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<<EOF\n{formatted_content}\nEOF")

+ 191 - 0
.github/workflows/changeset-ai-releases.yml

@@ -0,0 +1,191 @@
+name: Changeset AI Release
+run-name: Changeset AI Release ${{ github.actor != 'R00-B0T' && '- Create PR' || '- Approve & Release' }}
+
+on:
+  pull_request:
+    types: [closed, opened, synchronize, labeled]
+
+env:
+  REPO_PATH: ${{ github.repository }}
+  GIT_REF: ${{ github.head_ref }}
+
+jobs:
+  changeset-pr-version-bump:
+    if: >
+      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 [email protected]
+          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 }}

+ 1 - 1
.github/workflows/code-qa.yml

@@ -8,7 +8,7 @@ on:
     branches: [main]
 
 jobs:
-  code-qa:
+  compile:
     runs-on: ubuntu-latest
     steps:
       - name: Checkout code

+ 1 - 0
.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