mirror of
				https://github.com/esphome/esphome.git
				synced 2025-11-04 00:51:49 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			112 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			YAML
		
	
	
	
	
	
			
		
		
	
	
			112 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			YAML
		
	
	
	
	
	
---
 | 
						|
name: Memory Impact Comment (Forks)
 | 
						|
 | 
						|
on:
 | 
						|
  workflow_run:
 | 
						|
    workflows: ["CI"]
 | 
						|
    types: [completed]
 | 
						|
 | 
						|
permissions:
 | 
						|
  contents: read
 | 
						|
  pull-requests: write
 | 
						|
  actions: read
 | 
						|
 | 
						|
jobs:
 | 
						|
  memory-impact-comment:
 | 
						|
    name: Post memory impact comment (fork PRs only)
 | 
						|
    runs-on: ubuntu-24.04
 | 
						|
    # Only run for PRs from forks that had successful CI runs
 | 
						|
    if: >
 | 
						|
      github.event.workflow_run.event == 'pull_request' &&
 | 
						|
      github.event.workflow_run.conclusion == 'success' &&
 | 
						|
      github.event.workflow_run.head_repository.full_name != github.repository
 | 
						|
    env:
 | 
						|
      GH_TOKEN: ${{ github.token }}
 | 
						|
    steps:
 | 
						|
      - name: Get PR details
 | 
						|
        id: pr
 | 
						|
        run: |
 | 
						|
          # Get PR details by searching for PR with matching head SHA
 | 
						|
          # The workflow_run.pull_requests field is often empty for forks
 | 
						|
          # Use paginate to handle repos with many open PRs
 | 
						|
          head_sha="${{ github.event.workflow_run.head_sha }}"
 | 
						|
          pr_data=$(gh api --paginate "/repos/${{ github.repository }}/pulls" \
 | 
						|
            --jq ".[] | select(.head.sha == \"$head_sha\") | {number: .number, base_ref: .base.ref}" \
 | 
						|
            | head -n 1)
 | 
						|
 | 
						|
          if [ -z "$pr_data" ]; then
 | 
						|
            echo "No PR found for SHA $head_sha, skipping"
 | 
						|
            echo "skip=true" >> "$GITHUB_OUTPUT"
 | 
						|
            exit 0
 | 
						|
          fi
 | 
						|
 | 
						|
          pr_number=$(echo "$pr_data" | jq -r '.number')
 | 
						|
          base_ref=$(echo "$pr_data" | jq -r '.base_ref')
 | 
						|
 | 
						|
          echo "pr_number=$pr_number" >> "$GITHUB_OUTPUT"
 | 
						|
          echo "base_ref=$base_ref" >> "$GITHUB_OUTPUT"
 | 
						|
          echo "Found PR #$pr_number targeting base branch: $base_ref"
 | 
						|
 | 
						|
      - name: Check out code from base repository
 | 
						|
        if: steps.pr.outputs.skip != 'true'
 | 
						|
        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
 | 
						|
        with:
 | 
						|
          # Always check out from the base repository (esphome/esphome), never from forks
 | 
						|
          # Use the PR's target branch to ensure we run trusted code from the main repo
 | 
						|
          repository: ${{ github.repository }}
 | 
						|
          ref: ${{ steps.pr.outputs.base_ref }}
 | 
						|
 | 
						|
      - name: Restore Python
 | 
						|
        if: steps.pr.outputs.skip != 'true'
 | 
						|
        uses: ./.github/actions/restore-python
 | 
						|
        with:
 | 
						|
          python-version: "3.11"
 | 
						|
          cache-key: ${{ hashFiles('.cache-key') }}
 | 
						|
 | 
						|
      - name: Download memory analysis artifacts
 | 
						|
        if: steps.pr.outputs.skip != 'true'
 | 
						|
        run: |
 | 
						|
          run_id="${{ github.event.workflow_run.id }}"
 | 
						|
          echo "Downloading artifacts from workflow run $run_id"
 | 
						|
 | 
						|
          mkdir -p memory-analysis
 | 
						|
 | 
						|
          # Download target analysis artifact
 | 
						|
          if gh run download --name "memory-analysis-target" --dir memory-analysis --repo "${{ github.repository }}" "$run_id"; then
 | 
						|
            echo "Downloaded memory-analysis-target artifact."
 | 
						|
          else
 | 
						|
            echo "No memory-analysis-target artifact found."
 | 
						|
          fi
 | 
						|
 | 
						|
          # Download PR analysis artifact
 | 
						|
          if gh run download --name "memory-analysis-pr" --dir memory-analysis --repo "${{ github.repository }}" "$run_id"; then
 | 
						|
            echo "Downloaded memory-analysis-pr artifact."
 | 
						|
          else
 | 
						|
            echo "No memory-analysis-pr artifact found."
 | 
						|
          fi
 | 
						|
 | 
						|
      - name: Check if artifacts exist
 | 
						|
        id: check
 | 
						|
        if: steps.pr.outputs.skip != 'true'
 | 
						|
        run: |
 | 
						|
          if [ -f ./memory-analysis/memory-analysis-target.json ] && [ -f ./memory-analysis/memory-analysis-pr.json ]; then
 | 
						|
            echo "found=true" >> "$GITHUB_OUTPUT"
 | 
						|
          else
 | 
						|
            echo "found=false" >> "$GITHUB_OUTPUT"
 | 
						|
            echo "Memory analysis artifacts not found, skipping comment"
 | 
						|
          fi
 | 
						|
 | 
						|
      - name: Post or update PR comment
 | 
						|
        if: steps.pr.outputs.skip != 'true' && steps.check.outputs.found == 'true'
 | 
						|
        env:
 | 
						|
          PR_NUMBER: ${{ steps.pr.outputs.pr_number }}
 | 
						|
        run: |
 | 
						|
          . venv/bin/activate
 | 
						|
          # Pass PR number and JSON file paths directly to Python script
 | 
						|
          # Let Python parse the JSON to avoid shell injection risks
 | 
						|
          # The script will validate and sanitize all inputs
 | 
						|
          python script/ci_memory_impact_comment.py \
 | 
						|
            --pr-number "$PR_NUMBER" \
 | 
						|
            --target-json ./memory-analysis/memory-analysis-target.json \
 | 
						|
            --pr-json ./memory-analysis/memory-analysis-pr.json
 |