scaffold automated feature build for external contributors #3
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: External PR Trigger | |
| on: | |
| pull_request: | |
| types: [opened, synchronize, reopened] | |
| push: | |
| branches: | |
| - "**" | |
| - "!main" | |
| jobs: | |
| trigger-external-pr: | |
| runs-on: ubuntu-latest | |
| # Only run if the source branch does not have a PMM- prefix | |
| if: | | |
| (github.event_name == 'pull_request' && !startsWith(github.event.pull_request.head.ref, 'PMM-')) || | |
| (github.event_name == 'push' && !startsWith(github.ref_name, 'PMM-')) | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| - name: Setup Git Config | |
| run: | | |
| git config --global user.name "github-actions[bot]" | |
| git config --global user.email "github-actions[bot]@users.noreply.github.com" | |
| - name: Set variables based on event type | |
| id: set-vars | |
| run: | | |
| if [ "${{ github.event_name }}" == "pull_request" ]; then | |
| echo "source_branch=${{ github.event.pull_request.head.ref }}" >> $GITHUB_OUTPUT | |
| echo "pr_number=${{ github.event.pull_request.number }}" >> $GITHUB_OUTPUT | |
| echo "pr_author=${{ github.event.pull_request.user.login }}" >> $GITHUB_OUTPUT | |
| echo "pr_title=${{ github.event.pull_request.title }}" >> $GITHUB_OUTPUT | |
| echo "pr_url=${{ github.event.pull_request.html_url }}" >> $GITHUB_OUTPUT | |
| echo "pr_body=${{ github.event.pull_request.body }}" >> $GITHUB_OUTPUT | |
| else | |
| echo "source_branch=${{ github.ref_name }}" >> $GITHUB_OUTPUT | |
| echo "pr_number=N/A" >> $GITHUB_OUTPUT | |
| echo "pr_author=${{ github.actor }}" >> $GITHUB_OUTPUT | |
| echo "pr_title=Push to ${{ github.ref_name }}" >> $GITHUB_OUTPUT | |
| echo "pr_url=${{ github.server_url }}/${{ github.repository }}/tree/${{ github.ref_name }}" >> $GITHUB_OUTPUT | |
| echo "pr_body=Automated PR for push to branch ${{ github.ref_name }}" >> $GITHUB_OUTPUT | |
| fi | |
| - name: Create branch in target repository | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.TARGET_REPO_TOKEN }} | |
| TARGET_REPO: ${{ vars.TARGET_REPO_OWNER }}/${{ vars.TARGET_REPO_NAME }} | |
| SOURCE_BRANCH: ${{ steps.set-vars.outputs.source_branch }} | |
| PR_NUMBER: ${{ steps.set-vars.outputs.pr_number }} | |
| PR_AUTHOR: ${{ steps.set-vars.outputs.pr_author }} | |
| run: | | |
| # Clone the target repository | |
| git clone https://x-access-token:${GITHUB_TOKEN}@github.com/${TARGET_REPO}.git target-repo | |
| cd target-repo | |
| # Create a new branch based on the PR branch name | |
| git checkout -b "external-pr-${SOURCE_BRANCH}" | |
| # Check if ci.yml exists | |
| if [ ! -f "ci.yml" ]; then | |
| echo "Creating ci.yml file" | |
| mkdir -p $(dirname ci.yml) | |
| touch ci.yml | |
| fi | |
| # Modify ci.yml file with PR information | |
| cat > ci.yml << EOF | |
| # Auto-generated from external PR | |
| external_pr: | |
| source_repo: ${{ github.repository }} | |
| pr_number: ${PR_NUMBER} | |
| pr_author: ${PR_AUTHOR} | |
| pr_branch: ${SOURCE_BRANCH} | |
| pr_title: ${{ steps.set-vars.outputs.pr_title }} | |
| pr_url: ${{ steps.set-vars.outputs.pr_url }} | |
| triggered_at: $(date -u +"%Y-%m-%dT%H:%M:%SZ") | |
| event_type: ${{ github.event_name }} | |
| commit_sha: ${{ github.sha }} | |
| EOF | |
| # Commit changes | |
| git add ci.yml | |
| if [ "${{ github.event_name }}" == "pull_request" ]; then | |
| git commit -m "Update ci.yml for external PR #${PR_NUMBER} from ${PR_AUTHOR}" | |
| else | |
| git commit -m "Update ci.yml for push to ${SOURCE_BRANCH} by ${PR_AUTHOR}" | |
| fi | |
| # Push the new branch | |
| git push origin "external-pr-${SOURCE_BRANCH}" | |
| - name: Check if PR already exists in target repository | |
| id: check-pr | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.TARGET_REPO_TOKEN }} | |
| TARGET_REPO: ${{ vars.TARGET_REPO_OWNER }}/${{ vars.TARGET_REPO_NAME }} | |
| SOURCE_BRANCH: ${{ steps.set-vars.outputs.source_branch }} | |
| run: | | |
| # Check if a PR already exists for this branch | |
| EXISTING_PR=$(gh pr list --repo "${TARGET_REPO}" --head "external-pr-${SOURCE_BRANCH}" --json number --jq '.[0].number' || echo "") | |
| if [ -n "$EXISTING_PR" ]; then | |
| echo "PR already exists: #${EXISTING_PR}" | |
| echo "pr_exists=true" >> $GITHUB_OUTPUT | |
| echo "existing_pr_number=${EXISTING_PR}" >> $GITHUB_OUTPUT | |
| else | |
| echo "No existing PR found" | |
| echo "pr_exists=false" >> $GITHUB_OUTPUT | |
| fi | |
| - name: Create Pull Request in target repository | |
| if: steps.check-pr.outputs.pr_exists == 'false' | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.TARGET_REPO_TOKEN }} | |
| TARGET_REPO: ${{ vars.TARGET_REPO_OWNER }}/${{ vars.TARGET_REPO_NAME }} | |
| SOURCE_BRANCH: ${{ steps.set-vars.outputs.source_branch }} | |
| PR_NUMBER: ${{ steps.set-vars.outputs.pr_number }} | |
| PR_AUTHOR: ${{ steps.set-vars.outputs.pr_author }} | |
| PR_TITLE: ${{ steps.set-vars.outputs.pr_title }} | |
| PR_URL: ${{ steps.set-vars.outputs.pr_url }} | |
| PR_BODY: ${{ steps.set-vars.outputs.pr_body }} | |
| run: | | |
| # Create PR using GitHub CLI | |
| if [ "${{ github.event_name }}" == "pull_request" ]; then | |
| TITLE="External PR: ${PR_TITLE}" | |
| BODY="This PR was automatically generated from external pull request #${PR_NUMBER} by @${PR_AUTHOR} in ${{ github.repository }} (branch: ${SOURCE_BRANCH}). | |
| Original PR: ${PR_URL} | |
| ## Original PR Description | |
| ${PR_BODY}" | |
| else | |
| TITLE="External Push: ${SOURCE_BRANCH}" | |
| BODY="This PR was automatically generated from a push to branch ${SOURCE_BRANCH} by @${PR_AUTHOR} in ${{ github.repository }}. | |
| Branch: ${PR_URL} | |
| ## Push Details | |
| - Pusher: @${PR_AUTHOR} | |
| - Commit: ${{ github.sha }} | |
| - Timestamp: $(date -u +"%Y-%m-%dT%H:%M:%SZ")" | |
| fi | |
| gh pr create \ | |
| --repo "${TARGET_REPO}" \ | |
| --title "${TITLE}" \ | |
| --body "${BODY}" \ | |
| --base main \ | |
| --head "external-pr-${SOURCE_BRANCH}" | |
| - name: Update existing PR in target repository | |
| if: steps.check-pr.outputs.pr_exists == 'true' | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.TARGET_REPO_TOKEN }} | |
| TARGET_REPO: ${{ vars.TARGET_REPO_OWNER }}/${{ vars.TARGET_REPO_NAME }} | |
| EXISTING_PR: ${{ steps.check-pr.outputs.existing_pr_number }} | |
| SOURCE_BRANCH: ${{ steps.set-vars.outputs.source_branch }} | |
| run: | | |
| echo "PR #${EXISTING_PR} already exists in ${TARGET_REPO} for branch external-pr-${SOURCE_BRANCH}" | |
| echo "The branch has been updated with the latest changes." | |
| # Optionally, add a comment to the existing PR | |
| gh pr comment ${EXISTING_PR} \ | |
| --repo "${TARGET_REPO}" \ | |
| --body "Branch updated with new changes from ${{ github.event_name }} event at $(date -u +"%Y-%m-%dT%H:%M:%SZ")" |