More precisely, the name of the GitHub project board in question is “Closed bugs with new comments”, and since GitHub seems to do the closing and the commenting separately (and, crucially for this automation, in that order) when the closer uses the “Close with comment” functionality, we want to skip the comments added within 30 seconds after the closing. Release Notes: - N/A
79 lines
3.1 KiB
YAML
79 lines
3.1 KiB
YAML
name: "Surface closed issues someone's commented on"
|
|
|
|
on:
|
|
issue_comment:
|
|
types:
|
|
- created
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
jobs:
|
|
add-to-project:
|
|
if: >
|
|
github.repository == 'zed-industries/zed' &&
|
|
github.event.issue.state == 'closed' &&
|
|
github.event.issue.pull_request == null &&
|
|
github.event.issue.type != null &&
|
|
github.event.issue.type.name == 'Bug' &&
|
|
github.event.comment.user.type != 'Bot'
|
|
runs-on: namespace-profile-2x4-ubuntu-2404
|
|
timeout-minutes: 5
|
|
steps:
|
|
- id: is-post-close-comment
|
|
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
|
|
with:
|
|
script: |
|
|
const closedAt = new Date(context.payload.issue.closed_at);
|
|
const commentedAt = new Date(context.payload.comment.created_at);
|
|
const diffSeconds = Math.abs(commentedAt - closedAt) / 1000;
|
|
if (diffSeconds <= 30) {
|
|
core.notice(`Skipping — comment was likely part of "Close with comment" (${diffSeconds}s gap)`);
|
|
return false;
|
|
}
|
|
return true;
|
|
|
|
- if: steps.is-post-close-comment.outputs.result == 'true'
|
|
id: get-app-token
|
|
uses: actions/create-github-app-token@bef1eaf1c0ac2b148ee2a0a74c65fbe6db0631f1 # v2.1.4
|
|
with:
|
|
app-id: ${{ secrets.ZED_COMMUNITY_BOT_APP_ID }}
|
|
private-key: ${{ secrets.ZED_COMMUNITY_BOT_PRIVATE_KEY }}
|
|
owner: zed-industries
|
|
|
|
- if: steps.is-post-close-comment.outputs.result == 'true'
|
|
id: check-staff
|
|
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
|
|
with:
|
|
github-token: ${{ steps.get-app-token.outputs.token }}
|
|
script: |
|
|
try {
|
|
const response = await github.rest.teams.getMembershipForUserInOrg({
|
|
org: 'zed-industries',
|
|
team_slug: 'staff',
|
|
username: context.payload.comment.user.login
|
|
});
|
|
return response.data.state === 'active';
|
|
} catch (error) {
|
|
// 404 means user is not a member
|
|
if (error.status === 404) {
|
|
return false;
|
|
}
|
|
throw error;
|
|
}
|
|
|
|
- if: steps.is-post-close-comment.outputs.result == 'true' && steps.check-staff.outputs.result == 'true'
|
|
run: |
|
|
echo "::notice::Skipping issue #${{ github.event.issue.number }} - commenter is staff member"
|
|
|
|
# github-script outputs are JSON strings, so we compare against 'false' (string)
|
|
- if: steps.is-post-close-comment.outputs.result == 'true' && steps.check-staff.outputs.result == 'false'
|
|
run: |
|
|
echo "::notice::Adding issue #${{ github.event.issue.number }} to project (comment by ${{ github.event.comment.user.login }})"
|
|
|
|
- if: steps.is-post-close-comment.outputs.result == 'true' && steps.check-staff.outputs.result == 'false'
|
|
uses: actions/add-to-project@244f685bbc3b7adfa8466e08b698b5577571133e # v1.0.2
|
|
with:
|
|
project-url: https://github.com/orgs/zed-industries/projects/73
|
|
github-token: ${{ steps.get-app-token.outputs.token }}
|