Skip to content

Commit b96e0be

Browse files
committed
✨ Add composite actions for working with PRs
1 parent 942b347 commit b96e0be

File tree

5 files changed

+301
-0
lines changed

5 files changed

+301
-0
lines changed

pulls/add-assignees/action.yaml

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
name: Add assignees to Pull Request
2+
description: |
3+
A composite action for adding assignees to github pull requests.
4+
This requires `pull-requests: write` permissions in order to work correctly.
5+
6+
inputs:
7+
labels:
8+
required: true
9+
description: "A list of labels to add, separated by newlines."
10+
pull-number:
11+
required: false
12+
default: "0"
13+
description: "The pull request number to update"
14+
owner:
15+
required: false
16+
default: ""
17+
description: "The repository owner"
18+
repo:
19+
required: false
20+
default: ""
21+
description: "The repository"
22+
retries:
23+
required: false
24+
default: "0"
25+
description: "The number of times to try retrying"
26+
retry-exempt-status-codes:
27+
required: false
28+
default: "400,401,403,404,422"
29+
description: "The retry exempt status codes"
30+
31+
runs:
32+
using: "composite"
33+
steps:
34+
- name: Add assignees to pull request
35+
uses: actions/github-script@v7
36+
with:
37+
retries: ${{ inputs.retries }}
38+
retry-exempt-status-codes: ${{ inputs.retry-exempt-status-codes }}
39+
script: |
40+
github.rest.issues.addAssignees({
41+
owner: `${{ inputs.owner }}` || context.repo.owner,
42+
repo: `${{ inputs.repo }}` || context.repo.repo,
43+
issue_number: ${{ inputs.pull-number }} || context.issue.number,
44+
assignees: `${{ inputs.assignees }}`.split(/[\n,]/).map(s => s.trim()).filter(s => s)
45+
});

pulls/add-labels/action.yaml

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
name: Add labels to Pull Request
2+
description: |
3+
A composite action for adding labels to github pull requests.
4+
This requires `pull-requests: write` permissions in order to work correctly.
5+
6+
inputs:
7+
labels:
8+
required: true
9+
description: "A list of labels to add, separated by newlines."
10+
pull-number:
11+
required: false
12+
default: "0"
13+
description: "The pull request number to update"
14+
owner:
15+
required: false
16+
default: ""
17+
description: "The repository owner"
18+
repo:
19+
required: false
20+
default: ""
21+
description: "The repository"
22+
retries:
23+
required: false
24+
default: "0"
25+
description: "The number of times to try retrying"
26+
retry-exempt-status-codes:
27+
required: false
28+
default: "400,401,403,404,422"
29+
description: "The retry exempt status codes"
30+
31+
runs:
32+
using: "composite"
33+
steps:
34+
- name: Add labels to pull request
35+
uses: actions/github-script@v7
36+
with:
37+
retries: ${{ inputs.retries }}
38+
retry-exempt-status-codes: ${{ inputs.retry-exempt-status-codes }}
39+
script: |
40+
github.rest.issues.addLabels({
41+
owner: `${{ inputs.owner }}` || context.repo.owner,
42+
repo: `${{ inputs.repo }}` || context.repo.repo,
43+
issue_number: ${{ inputs.pull-number }} || context.issue.number,
44+
labels: `${{ inputs.labels }}`.split(/[\n,]/).map(s => s.trim()).filter(s => s)
45+
});

pulls/close/action.yaml

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
name: Close pull request
2+
description: |
3+
A composite action for closing a pull request.
4+
This requires `pulls: write` permissions in order to work correctly.
5+
6+
inputs:
7+
pull-number:
8+
required: false
9+
default: "0"
10+
description: "The pull request number to comment on"
11+
owner:
12+
required: false
13+
default: ""
14+
description: "The repository owner"
15+
repo:
16+
required: false
17+
default: ""
18+
description: "The repository"
19+
retries:
20+
required: false
21+
default: "0"
22+
description: "The number of times to try retrying"
23+
retry-exempt-status-codes:
24+
required: false
25+
default: "400,401,403,404,422"
26+
description: "The retry exempt status codes"
27+
outputs:
28+
pull-number:
29+
value: ${{ steps.close.outputs.pull-number }}
30+
description: "The pull request number that was closed"
31+
32+
runs:
33+
using: "composite"
34+
steps:
35+
- name: Close pull request
36+
id: close
37+
uses: actions/github-script@v7
38+
with:
39+
retries: ${{ inputs.retries }}
40+
retry-exempt-status-codes: ${{ inputs.retry-exempt-status-codes }}
41+
script: |
42+
const { data: pull } = await github.rest.pulls.update({
43+
owner: `${{ inputs.owner }}` || context.repo.owner,
44+
repo: `${{ inputs.repo }}` || context.repo.repo,
45+
pull_number: ${{ inputs.pull_number }} || context.issue.number,
46+
state: 'closed'
47+
});
48+
core.setOutput('pull-number', pull.number)

pulls/create-comment/action.yaml

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
name: Create comment on Pull Request
2+
description: |
3+
A composite action that creates a comment on a pull-request.
4+
Requires the `pull-requests: write` permission to work.
5+
6+
inputs:
7+
body:
8+
required: true
9+
description: "The message to comment"
10+
pull-number:
11+
required: false
12+
default: "0"
13+
description: "The pull-request number to comment on."
14+
owner:
15+
required: false
16+
default: ""
17+
description: "The repository owner"
18+
repo:
19+
required: false
20+
default: ""
21+
description: "The repository"
22+
retries:
23+
required: false
24+
default: "0"
25+
description: "The number of times to try retrying"
26+
retry-exempt-status-codes:
27+
required: false
28+
default: "400,401,403,404,422"
29+
description: "The retry exempt status codes"
30+
outputs:
31+
comment-id:
32+
value: ${{ steps.create-comment.outputs.comment-id }}
33+
description: "The ID of the created comment"
34+
comment-url:
35+
value: ${{ steps.create-comment.outputs.comment-url }}
36+
description: "A browser URL to the created comment"
37+
comment-api-url:
38+
value: ${{ steps.create-comment.outputs.comment-api-url }}
39+
description: "An API URL to the created comment"
40+
41+
runs:
42+
using: "composite"
43+
steps:
44+
- name: Leave Issue or Pull Request comment
45+
uses: actions/github-script@v7
46+
with:
47+
retries: ${{ inputs.retries }}
48+
retry-exempt-status-codes: ${{ inputs.retry-exempt-status-codes }}
49+
script: |
50+
const { data: comment } = await github.rest.issues.createComment({
51+
owner: `${{ inputs.owner }}` || context.repo.owner,
52+
repo: `${{ inputs.repo }}` || context.repo.repo,
53+
issue_number: ${{ inputs.pull-number }} || context.issue.number,
54+
body: `${{ inputs.body }}`
55+
})
56+
core.setOutput('comment-id', comment.id)
57+
core.setOutput('comment-url', comment.html_url)
58+
core.setOutput('comment-api-url', comment.url)

pulls/get/action.yaml

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
name: Get pull request
2+
description: |
3+
A composite action that gets a pull request on Github.
4+
Requires the `pull-requests: read` permission to work.
5+
6+
inputs:
7+
pull-number:
8+
required: false
9+
default: "0"
10+
description: "The pull request number to get"
11+
owner:
12+
required: false
13+
default: ""
14+
description: "The repository owner"
15+
repo:
16+
required: false
17+
default: ""
18+
description: "The repository"
19+
retries:
20+
required: false
21+
default: "0"
22+
description: "The number of times to try retrying"
23+
retry-exempt-status-codes:
24+
required: false
25+
default: "400,401,403,404,422"
26+
description: "The retry exempt status codes"
27+
outputs:
28+
pull-number:
29+
value: ${{ steps.get-pull.outputs.pull-number }}
30+
description: The pull request number
31+
assignees:
32+
value: ${{ steps.get-pull.outputs.assignees }}
33+
description: The assignee(s) for this pull requst, as a JSON array of string logins
34+
assignees-count:
35+
value: ${{ steps.get-pull.outputs.assignees }}
36+
description: The number of assignee(s) for this pull requst
37+
user-reviewers:
38+
value: ${{ steps.get-pull.outputs.user-reviewers }}
39+
description: The user reviewers for this pull requst, as a JSON array of string logins
40+
user-reviewers-count:
41+
value: ${{ steps.get-pull.outputs.user-reviewers-count }}
42+
description: The number of user reviewers assigned to this pull request
43+
team-reviewers:
44+
value: ${{ steps.get-pull.outputs.team-reviewers }}
45+
description: The team revieweers for this pull requst, as a JSON array of string logins
46+
team-reviewers-count:
47+
value: ${{ steps.get-pull.outputs.team-reviewers-count }}
48+
description: The number of team reviewers assigned to this pull request
49+
labels:
50+
value: ${{ steps.get-pull.outputs.labels }}
51+
description: The labels assigned to this PR, as a JSON array of label names
52+
labels-count:
53+
value: ${{ steps.get-pull.outputs.labels }}
54+
description: The number of labels assigned to this PR
55+
title:
56+
value: ${{ steps.get-pull.outputs.title }}
57+
description: The title of this PR
58+
body:
59+
value: ${{ steps.get-pull.outputs.body }}
60+
description: The body of this PR
61+
state:
62+
value: ${{ steps.get-pull.outputs.state }}
63+
description: The state of this PR
64+
draft:
65+
value: ${{ steps.get-pull.outputs.draft }}
66+
description: Whether the PR is a draft PR
67+
merged:
68+
value: ${{ steps.get-pull.outputs.merged }}
69+
description: Whether the PR is merged.
70+
locked:
71+
value: ${{ steps.get-pull.outputs.locked }}
72+
description: Whether this issue is currently locked
73+
74+
runs:
75+
using: "composite"
76+
steps:
77+
- name: Gets a pull request
78+
id: get-pull
79+
uses: actions/github-script@v7
80+
with:
81+
retries: ${{ inputs.retries }}
82+
retry-exempt-status-codes: ${{ inputs.retry-exempt-status-codes }}
83+
script: |
84+
const { data: pull } = await github.rest.pulls.get({
85+
owner: `${{ inputs.owner }}` || context.repo.owner,
86+
repo: `${{ inputs.repo }}` || context.repo.repo,
87+
issue_number: ${{ inputs.pull-number }} || context.issue.number,
88+
})
89+
core.setOutput('pull-number', pull?.number)
90+
core.setOutput('pull-api-url', issue.url)
91+
core.setOutput('pull-url', issue.html_url)
92+
core.setOutput('assignees', pull?.assignees?.map(v => v.login))
93+
core.setOutput('assignees-count', pull?.assignees?.length)
94+
core.setOutput('user-reviewers', pull?.requested_reviewers?.map(v => v.login))
95+
core.setOutput('user-reviewers-count', pull?.requested_reviewers?.length)
96+
core.setOutput('team-reviewers', pull?.requested_teams?.map(v => v.login))
97+
core.setOutput('team-reviewers-count', pull?.requested_teams?.length)
98+
core.setOutput('labels', pull?.labels?.map(v => v.name))
99+
core.setOutput('labels-count', pull?.labels?.length)
100+
core.setOutput('title', pull?.title)
101+
core.setOutput('body', pull?.body)
102+
core.setOutput('state', pull?.state)
103+
core.setOutput('draft', pull?.draft)
104+
core.setOutput('merged', pull?.merged)
105+
core.setOutput('locked', pull?.locked)

0 commit comments

Comments
 (0)