| # SPDX-License-Identifier: Apache-2.0 |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| # |
| # This workflow will fetch the PR Labels from the PR Artifact, and write |
| # the PR Labels into the PR. The workflow is called after the |
| # "pull_request" trigger (labeler.yml). This "workflow_run" trigger uses a |
| # GitHub Token with Write Permission, so we must never run any untrusted |
| # code from the PR, and we must always extract and use the PR Artifact |
| # safely. See https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=321719166#GitHubActionsSecurity-Buildstriggeredwithworkflow_run |
| name: "Set Pull Request Labels" |
| on: |
| workflow_run: |
| workflows: ["Pull Request Labeler"] |
| types: |
| - completed |
| |
| jobs: |
| pr_labeler: |
| permissions: |
| contents: read |
| pull-requests: write |
| issues: write |
| runs-on: ubuntu-latest |
| if: > |
| github.event.workflow_run.event == 'pull_request' && |
| github.event.workflow_run.conclusion == 'success' |
| steps: |
| # Download the PR Artifact, containing PR Number and PR Labels |
| - name: Download PR artifact |
| uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 |
| with: |
| script: | |
| const artifacts = await github.rest.actions.listWorkflowRunArtifacts({ |
| owner: context.repo.owner, |
| repo: context.repo.repo, |
| run_id: ${{ github.event.workflow_run.id }}, |
| }); |
| const matchArtifact = artifacts.data.artifacts.filter((artifact) => { |
| return artifact.name == "pr" |
| })[0]; |
| const download = await github.rest.actions.downloadArtifact({ |
| owner: context.repo.owner, |
| repo: context.repo.repo, |
| artifact_id: matchArtifact.id, |
| archive_format: 'zip', |
| }); |
| const fs = require('fs'); |
| fs.writeFileSync('${{github.workspace}}/pr.zip', Buffer.from(download.data)); |
| |
| # Unzip the PR Artifact |
| - name: Unzip PR artifact |
| run: unzip pr.zip |
| |
| # Write the PR Labels into the PR |
| - name: Write PR labels |
| uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 |
| with: |
| github-token: ${{ secrets.GITHUB_TOKEN }} |
| script: | |
| const owner = context.repo.owner; |
| const repo = context.repo.repo; |
| const fs = require('fs'); |
| |
| // Read the PR Number and PR Labels from the PR Artifact |
| // e.g. 'Size: XS\nArch: avr\n' |
| const issue_number = Number(fs.readFileSync('pr-id.txt')); |
| const labels = fs.readFileSync('pr-labels.txt', 'utf8') |
| .split('\n') // Split by newline |
| .filter(s => (s != '')); // Remove empty lines |
| console.log({ issue_number, labels }); |
| |
| // Write the PR Labels into the PR |
| // e.g. [ 'Size: XS', 'Arch: avr' ] |
| await github.rest.issues.setLabels({ |
| owner, |
| repo, |
| issue_number, |
| labels |
| }); |