Skip to content
Open
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 76 additions & 0 deletions .github/workflows/issue-kind-label.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
name: Apply kind/area labels and milestone from issue body

on:
issues:
types: [opened, edited]

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit:
types: [opened, edited] omits reopened, which pr-kind-label.yaml includes for the same trigger. If reopening an issue can leave a stale label state, add reopened for parity; otherwise fine as is.


jobs:
kind-labels:
runs-on: ubuntu-latest
permissions:
issues: write
steps:
Comment thread
hickeyma marked this conversation as resolved.
- name: Sync kind labels
env:
GH_TOKEN: ${{ github.token }}
ISSUE_BODY: ${{ github.event.issue.body }}
ISSUE_NUMBER: ${{ github.event.issue.number }}
REPO: ${{ github.repository }}
run: |
# Extract /kind values from issue body. Absence of a directive is a no-op
# to avoid wiping kind/* labels set by maintainers through the UI.
kinds=$(printf '%s' "$ISSUE_BODY" | tr -d '\r' | sed -n 's|^/kind[[:space:]][[:space:]]*||p' | sed 's|[[:space:]]*$||' | sed '/^$/d' | sort -u)
[ -z "$kinds" ] && exit 0

# Remove existing kind/* labels
gh issue view "$ISSUE_NUMBER" --repo "$REPO" --json labels \
-q '.labels[].name | select(startswith("kind/"))' | \
while IFS= read -r label; do
gh issue edit "$ISSUE_NUMBER" --repo "$REPO" --remove-label "$label" || echo "::warning::Failed to remove label '$label'"
done

printf '%s\n' "$kinds" | \
while IFS= read -r kind; do
gh issue edit "$ISSUE_NUMBER" --repo "$REPO" --add-label "kind/$kind" || \
echo "::warning::Label 'kind/$kind' not found in repository"
done
Comment thread
hickeyma marked this conversation as resolved.
Comment thread
hickeyma marked this conversation as resolved.

- name: Set area labels
env:
GH_TOKEN: ${{ github.token }}
ISSUE_BODY: ${{ github.event.issue.body }}
ISSUE_NUMBER: ${{ github.event.issue.number }}
REPO: ${{ github.repository }}
run: |
# Absence of a directive is a no-op. Area labels are also set by
# maintainers through the UI and clearing here would wipe those.
areas=$(printf '%s' "$ISSUE_BODY" | tr -d '\r' | sed -n 's|^/area[[:space:]][[:space:]]*||p' | \
sed 's|[[:space:]]*$||' | sed '/^$/d' | sort -u)
[ -z "$areas" ] && exit 0

# Remove existing area/* labels
gh issue view "$ISSUE_NUMBER" --repo "$REPO" --json labels \
-q '.labels[].name | select(startswith("area/"))' | \
while IFS= read -r label; do
gh issue edit "$ISSUE_NUMBER" --repo "$REPO" --remove-label "$label" || echo "::warning::Failed to remove label '$label'"
done

printf '%s\n' "$areas" | \
while IFS= read -r area; do
gh issue edit "$ISSUE_NUMBER" --repo "$REPO" --add-label "area/$area" || \
echo "::warning::Label 'area/$area' not found in repository"
done

- name: Set milestone
env:
GH_TOKEN: ${{ github.token }}
ISSUE_BODY: ${{ github.event.issue.body }}
ISSUE_NUMBER: ${{ github.event.issue.number }}
REPO: ${{ github.repository }}
run: |
# Use the last /milestone directive in the issue body
milestone=$(printf '%s' "$ISSUE_BODY" | tr -d '\r' | sed -n 's|^/milestone[[:space:]][[:space:]]*||p' | \
sed 's|[[:space:]]*$||' | sed '/^$/d' | tail -n 1)
[ -z "$milestone" ] && exit 0
gh issue edit "$ISSUE_NUMBER" --repo "$REPO" --milestone "$milestone" || \
echo "::warning::Milestone '$milestone' not found in repository"
Comment thread
hickeyma marked this conversation as resolved.
Outdated
Loading