Skip to content

Commit f33cc39

Browse files
committed
✨ Add additional issue-related actions
1 parent 33d19f8 commit f33cc39

File tree

6 files changed

+360
-0
lines changed

6 files changed

+360
-0
lines changed
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
name: Create issue or comment
2+
description: |
3+
A composite action for getting either creating a Github issue, or commenting on
4+
an existing one, based on the author and the provided label(s), assignees, etc.
5+
This requires `issues: write` permissions in order to work correctly.
6+
7+
inputs:
8+
title:
9+
required: true
10+
description: "The title to use for the issue"
11+
body:
12+
required: false
13+
default: ""
14+
description: "The body text of the github issue"
15+
comment:
16+
required: false
17+
default: ${{ inputs.body }}
18+
description: "The comment to leave if an issue already exists"
19+
labels:
20+
required: false
21+
default: ""
22+
description: "A list of labels to add, separated by newlines."
23+
assignees:
24+
required: false
25+
default: ""
26+
description: "A list of assignees to add, separated by newlines."
27+
owner:
28+
required: false
29+
default: ""
30+
description: "The repository owner"
31+
repo:
32+
required: false
33+
default: ""
34+
description: "The repository"
35+
retries:
36+
required: false
37+
default: "3"
38+
description: "The number of times to try retrying"
39+
retry-exempt-status-codes:
40+
required: false
41+
default: "400,401,403,404,422"
42+
description: "The retry exempt status codes"
43+
outputs:
44+
issue-number:
45+
value: ${{ steps.create-or-comment.outputs.issue-number }}
46+
description: "The number of the created issue"
47+
issue-url:
48+
value: ${{ steps.create-or-comment.outputs.issue-url }}
49+
description: "The HTTP URL of the newly created issue"
50+
created-issue:
51+
value: ${{ steps.create-or-comment.outputs.created-issue }}
52+
description: "A boolean indicating whether a new issue was created"
53+
54+
runs:
55+
using: "composite"
56+
steps:
57+
- name: Create issue or comment on existing
58+
id: create-or-comment
59+
uses: actions/github-script@v7
60+
with:
61+
retries: ${{ inputs.retries }}
62+
retry-exempt-status-codes: ${{ inputs.retry-exempt-status-codes }}
63+
script: |
64+
const issues = await github.paginate(github.rest.issues.listForRepo, {
65+
owner: `${{ inputs.owner }}` || context.repo.owner,
66+
repo: `${{ inputs.repo }}` || context.repo.repo,
67+
labels: `${{ inputs.labels }}`.split(/[\n,]/).map(s => s.trim()).filter(s => s),
68+
assignees: `${{ inputs.assignees }}`.split(/[\n,]/).map(s => s.trim()).filter(s => s),
69+
state: 'open',
70+
})
71+
for (const issue of issues) {
72+
if (!issue.pull_request) {
73+
await github.rest.issues.createComment({
74+
issue_number: issue.number,
75+
owner: `${{ inputs.owner }}` || context.repo.owner,
76+
repo: `${{ inputs.repo }}` || context.repo.repo,
77+
body: `${{ inputs.comment }}`
78+
})
79+
core.setOutput('issue-number', issue.number)
80+
core.setOutput('issue-url', issue.html_url)
81+
core.setOutput('created-issue', false)
82+
return
83+
}
84+
}
85+
86+
await github.rest.issues.create({
87+
owner: `${{ inputs.owner }}` || context.repo.owner,
88+
repo: `${{ inputs.repo }}` || context.repo.repo,
89+
labels: `${{ inputs.labels }}`.split(/[\n,]/).map(s => s.trim()).filter(s => s),
90+
title: `${{ inputs.title }}`,
91+
body: `${{ inputs.body }}`,
92+
assignees: `${{ inputs.assignees }}`.split(/[\n,]/).map(s => s.trim()).filter(s => s),
93+
})
94+
core.setOutput('issue-number', issue.number)
95+
core.setOutput('issue-url', issue.html_url)
96+
core.setOutput('created-issue', true)
97+
98+
99+

issues/delete-comment/action.yaml

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
name: Delete comment
2+
description: |
3+
A composite action for deleting comments.
4+
This requires `issues: write` permissions in order to work correctly.
5+
6+
inputs:
7+
comment-id:
8+
required: true
9+
description: "The comment to delete"
10+
owner:
11+
required: false
12+
default: ""
13+
description: "The repository owner"
14+
repo:
15+
required: false
16+
default: ""
17+
description: "The repository"
18+
retries:
19+
required: false
20+
default: "0"
21+
description: "The number of times to try retrying"
22+
retry-exempt-status-codes:
23+
required: false
24+
default: "400,401,403,404,422"
25+
description: "The retry exempt status codes"
26+
27+
runs:
28+
using: "composite"
29+
steps:
30+
- name: Lock Issue
31+
id: update
32+
uses: actions/github-script@v7
33+
with:
34+
retries: ${{ inputs.retries }}
35+
retry-exempt-status-codes: ${{ inputs.retry-exempt-status-codes }}
36+
script: |
37+
github.rest.issues.deleteComment({
38+
owner: `${{ inputs.owner }}` || context.repo.owner,
39+
repo: `${{ inputs.repo }}` || context.repo.repo,
40+
comment_id: ${{ inputs.comment-id }}
41+
});

issues/get/action.yaml

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
name: Gets an issue
2+
description: |
3+
A composite action for getting a github issue by its issue number.
4+
This requires `issues: write` permissions in order to work correctly.
5+
6+
inputs:
7+
issue-number:
8+
required: false
9+
default: "0"
10+
description: "The issue 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: "3"
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+
issue-number:
29+
value: ${{ steps.get-issue.outputs.issue-number }}
30+
description: The number of the issue that was retrieved.
31+
issue-api-url:
32+
value: ${{ steps.get-issue.outputs.issue-api-url }}
33+
description: The API URL corresponding to this issue.
34+
issue-url:
35+
value: ${{ steps.get-issue.outputs.issue-url }}
36+
description: The browser URL corresponding to this issue.
37+
assignees:
38+
value: ${{ steps.get-issue.outputs.assignees }}
39+
description: A JSON array of all the assignee logins for this issue.
40+
labels:
41+
value: ${{ steps.get-issue.outputs.labels }}
42+
description: A JSON array of all the label names for this issue.
43+
title:
44+
value: ${{ steps.get-issue.outputs.title }}
45+
description: The title of the created issue
46+
body:
47+
value: ${{ steps.get-issue.outputs.body }}
48+
description: The body description of the issue
49+
state:
50+
value: ${{ steps.get-issue.outputs.state }}
51+
description: The state of the issue
52+
state-reason:
53+
value: ${{ steps.get-issue.outputs.state-reason }}
54+
description: The reason for the state
55+
locked:
56+
value: ${{ steps.get-issue.outputs.locked }}
57+
description: Whether this issue is currently locked
58+
59+
runs:
60+
using: "composite"
61+
steps:
62+
- name: Get issue
63+
id: get-issue
64+
uses: actions/github-script@v7
65+
with:
66+
retries: ${{ inputs.retries }}
67+
retry-exempt-status-codes: ${{ inputs.retry-exempt-status-codes }}
68+
script: |
69+
const { data: issue } = await github.rest.issues.get({
70+
owner: `${{ inputs.owner }}` || context.repo.owner,
71+
repo: `${{ inputs.repo }}` || context.repo.repo,
72+
issue_number: ${{ inputs.issue-number }} || context.issue.number,
73+
})
74+
core.setOutput('issue-number', issue.number)
75+
core.setOutput('issue-api-url', issue.url)
76+
core.setOutput('issue-url', issue.html_url)
77+
core.setOutput('assignees', issue?.assignees?.map(v => v.login))
78+
core.setOutput('labels', issue?.labels?.map(v => v.name))
79+
core.setOutput('title', issue?.title)
80+
core.setOutput('body', issue?.body)
81+
core.setOutput('state', issue?.state)
82+
core.setOutput('state-reason', issue?.state_reason)
83+
core.setOutput('locked', issue?.locked)

issues/remove-assignee/action.yaml

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
name: Remove assignees from issue
2+
description: |
3+
A composite action for removing a assignees from a github issues.
4+
This requires `issues: write` permissions in order to work correctly.
5+
6+
inputs:
7+
assignees:
8+
required: true
9+
description: "A list of assignees to remove, separated by either newlines or commas."
10+
issue-number:
11+
required: false
12+
default: "0"
13+
description: "The issue 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+
31+
runs:
32+
using: "composite"
33+
steps:
34+
- name: Remove assignees from issue
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.removeAssignees({
41+
owner: `${{ inputs.owner }}` || context.repo.owner,
42+
repo: `${{ inputs.repo }}` || context.repo.repo,
43+
issue_number: ${{ inputs.issue-number }} || context.issue.number,
44+
assignees: `${{ inputs.assignees }}`.split(/[\n,]/).map(s => s.trim()).filter(s => s)
45+
});

issues/remove-label/action.yaml

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
name: Remove labels from issue
2+
description: |
3+
A composite action for removing labels from a github issues.
4+
This requires `issues: 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 either newlines or commas."
10+
issue-number:
11+
required: false
12+
default: "0"
13+
description: "The issue 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+
31+
runs:
32+
using: "composite"
33+
steps:
34+
- name: Remove issue labels
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+
for label in `${{ inputs.labels }}`.split(/[\n,]/).map(s => s.trim()).filter(s => s) {
41+
github.rest.issues.removeLabel({
42+
owner: `${{ inputs.owner }}` || context.repo.owner,
43+
repo: `${{ inputs.repo }}` || context.repo.repo,
44+
issue_number: ${{ inputs.issue-number }} || context.issue.number,
45+
name: label
46+
});
47+
}

issues/set-labels/action.yaml

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
name: Sets labels on an issue
2+
description: |
3+
A composite action for setting labels to github issues.
4+
This requires `issues: 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+
issue-number:
11+
required: false
12+
default: "0"
13+
description: "The issue 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+
31+
runs:
32+
using: "composite"
33+
steps:
34+
- name: Add issue labels
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.setLabels({
41+
owner: `${{ inputs.owner }}` || context.repo.owner,
42+
repo: `${{ inputs.repo }}` || context.repo.repo,
43+
issue_number: ${{ inputs.issue-number }} || context.issue.number,
44+
labels: `${{ inputs.labels }}`.split(/[\n,]/).map(s => s.trim()).filter(s => s)
45+
});

0 commit comments

Comments
 (0)