Provide a user-friendly interface within Backstage for editing devfile-based application configurations. #2745
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Issue Management | |
on: | |
issues: | |
types: | |
- opened | |
- reopened | |
- labeled | |
- unlabeled | |
env: | |
ORGANIZATION: redhat-developer | |
# See https://github.com/redhat-developer/odo/projects?query=is%3Aopen | |
PROJECT_NUMBER: 16 | |
jobs: | |
manage_issue_labels: | |
name: Label issue | |
if: ${{ github.event.action == 'opened' || github.event.action == 'reopened' }} | |
runs-on: ubuntu-latest | |
concurrency: issue_labels-${{ github.event.issue.number }} | |
permissions: | |
issues: write | |
steps: | |
- name: Add needs-triage label | |
# Action recommended in https://docs.github.com/en/actions/managing-issues-and-pull-requests/adding-labels-to-issues | |
# Recommended to pin unofficial Actions to a specific commit SHA | |
uses: andymckay/labeler@3a4296e9dcdf9576b0456050db78cfd34853f260 | |
with: | |
add-labels: "needs-triage" | |
repo-token: ${{ secrets.GITHUB_TOKEN }} | |
manage_issue_in_project: | |
name: Manage issue in Project | |
runs-on: ubuntu-latest | |
if: ${{ always() }} | |
needs: manage_issue_labels | |
concurrency: issue_management_in_project-${{ github.event.issue.number }}-${{ github.event.action }} | |
env: | |
# Personal Access Token (PAT) to be created with 'repo' and 'project' scopes and be added as repository secret. | |
GITHUB_TOKEN: ${{ secrets.PROJECT_MANAGEMENT_TOKEN }} | |
steps: | |
- name: Get project data | |
run: | | |
gh api graphql -f query=' | |
query($org: String!, $number: Int!) { | |
organization(login: $org){ | |
projectV2(number: $number) { | |
id | |
fields(first:20) { | |
nodes { | |
... on ProjectV2Field { | |
id | |
name | |
} | |
... on ProjectV2SingleSelectField { | |
id | |
name | |
options { | |
id | |
name | |
} | |
} | |
} | |
} | |
} | |
} | |
}' -f org=$ORGANIZATION -F number=$PROJECT_NUMBER > project_data.json | |
cat project_data.json | |
echo 'PROJECT_ID='$(jq '.data.organization.projectV2.id' project_data.json) >> $GITHUB_ENV | |
echo 'PRIORITY_FIELD_ID='$(jq '.data.organization.projectV2.fields.nodes[] | select(.name== "Priority") |.id' project_data.json) >> $GITHUB_ENV | |
echo 'PRIORITY_URGENT_OPTION_ID='$(jq '.data.organization.projectV2.fields.nodes[] | select(.name== "Priority") | .options[] | select(.name | startswith("Urgent")) |.id' project_data.json) >> $GITHUB_ENV | |
echo 'PRIORITY_HIGH_OPTION_ID='$(jq '.data.organization.projectV2.fields.nodes[] | select(.name== "Priority") | .options[] | select(.name | startswith("High")) |.id' project_data.json) >> $GITHUB_ENV | |
echo 'PRIORITY_MEDIUM_OPTION_ID='$(jq '.data.organization.projectV2.fields.nodes[] | select(.name== "Priority") | .options[] | select(.name | startswith("Medium")) |.id' project_data.json) >> $GITHUB_ENV | |
echo 'PRIORITY_LOW_OPTION_ID='$(jq '.data.organization.projectV2.fields.nodes[] | select(.name== "Priority") | .options[] | select(.name | startswith("Low")) |.id' project_data.json) >> $GITHUB_ENV | |
- name: Add issue to Project | |
env: | |
ISSUE_ID: ${{ github.event.issue.node_id }} | |
run: | | |
gh api graphql -f query=' | |
mutation($project: ID!, $issue: ID!) { | |
addProjectV2ItemById( | |
input: { | |
projectId: $project | |
contentId: $issue | |
} | |
) { | |
item { | |
id | |
} | |
} | |
}' -f project=${{ env.PROJECT_ID }} -f issue=$ISSUE_ID > project_mutation_result.json | |
cat project_mutation_result.json | |
echo 'ITEM_ID='$(jq '.data.addProjectV2ItemById.item.id' project_mutation_result.json) >> $GITHUB_ENV | |
- name: Set Priority field in Project based on label added | |
if: ${{ github.event.action == 'labeled' && startsWith(github.event.label.name, 'priority/') }} | |
env: | |
ISSUE_ID: ${{ github.event.issue.node_id }} | |
PRIORITY_LABEL: ${{ github.event.label.name }} | |
run: | | |
if [[ "$PRIORITY_LABEL" == "priority/critical-urgent" ]] || [[ "$PRIORITY_LABEL" == "priority/Critical" ]]; then | |
echo Setting Urgent priority value: ${{ env.PRIORITY_URGENT_OPTION_ID }} | |
export priority_field_value=${{ env.PRIORITY_URGENT_OPTION_ID }} | |
elif [[ "$PRIORITY_LABEL" == "priority/High" ]]; then | |
echo Setting High priority value: ${{ env.PRIORITY_HIGH_OPTION_ID }} | |
export priority_field_value=${{ env.PRIORITY_HIGH_OPTION_ID }} | |
elif [[ "$PRIORITY_LABEL" == "priority/Medium" ]]; then | |
echo Setting Medium priority value: ${{ env.PRIORITY_MEDIUM_OPTION_ID }} | |
export priority_field_value=${{ env.PRIORITY_MEDIUM_OPTION_ID }} | |
elif [[ "$PRIORITY_LABEL" == "priority/Low" ]]; then | |
echo Setting Low priority value: ${{ env.PRIORITY_LOW_OPTION_ID }} | |
export priority_field_value=${{ env.PRIORITY_LOW_OPTION_ID }} | |
else | |
echo "Ignoring unknown priority label value: $PRIORITY_LABEL" | |
fi | |
echo "priority_field_value: $priority_field_value" | |
if [ -n "$priority_field_value" ]; then | |
gh api graphql -f query=' | |
mutation($project: ID!, $item: ID!, $priority_field: ID!, $priority_value: String!) { | |
updateProjectV2ItemFieldValue( | |
input: { | |
projectId: $project | |
itemId: $item | |
fieldId: $priority_field | |
value: { | |
singleSelectOptionId: $priority_value | |
} | |
} | |
) { | |
projectV2Item { | |
id | |
} | |
} | |
}' -f project=${{ env.PROJECT_ID }} -f item=${{ env.ITEM_ID }} -f priority_field=${{ env.PRIORITY_FIELD_ID }} -f priority_value=$priority_field_value | |
fi | |
- name: Set Priority field in Project based on label removed | |
if: ${{ github.event.action == 'unlabeled' && startsWith(github.event.label.name, 'priority/') }} | |
env: | |
ISSUE_ID: ${{ github.event.issue.node_id }} | |
run: | | |
# Find an already existing label for that issue, and set the field in the Project. Otherwise, clear the field. | |
priorityLabels=$(gh issue view ${{ github.event.issue.number }} -R ${GITHUB_REPOSITORY} --json labels --jq '.labels.[] | select(.name | startswith("priority/")) |.name') | |
if [ -n "$priorityLabels" ]; then | |
echo "Handling priority labels: $priorityLabels" | |
for priorityLabel in $priorityLabels; do | |
# The last value wins | |
if [[ "$priorityLabel" == "priority/critical-urgent" ]] || [[ "$priorityLabel" == "priority/Critical" ]]; then | |
echo Setting Urgent priority value: ${{ env.PRIORITY_URGENT_OPTION_ID }} | |
export priority_field_value=${{ env.PRIORITY_URGENT_OPTION_ID }} | |
elif [[ "$priorityLabel" == "priority/High" ]]; then | |
echo Setting High priority value: ${{ env.PRIORITY_HIGH_OPTION_ID }} | |
export priority_field_value=${{ env.PRIORITY_HIGH_OPTION_ID }} | |
elif [[ "$priorityLabel" == "priority/Medium" ]]; then | |
echo Setting Medium priority value: ${{ env.PRIORITY_MEDIUM_OPTION_ID }} | |
export priority_field_value=${{ env.PRIORITY_MEDIUM_OPTION_ID }} | |
elif [[ "$priorityLabel" == "priority/Low" ]]; then | |
echo Setting Low priority value: ${{ env.PRIORITY_LOW_OPTION_ID }} | |
export priority_field_value=${{ env.PRIORITY_LOW_OPTION_ID }} | |
else | |
echo "Ignoring unknown priority label value: $priorityLabel" | |
fi | |
echo "priority_field_value: $priority_field_value" | |
if [ -n "$priority_field_value" ]; then | |
gh api graphql -f query=' | |
mutation($project: ID!, $item: ID!, $priority_field: ID!, $priority_value: String!) { | |
updateProjectV2ItemFieldValue( | |
input: { | |
projectId: $project | |
itemId: $item | |
fieldId: $priority_field | |
value: { | |
singleSelectOptionId: $priority_value | |
} | |
} | |
) { | |
projectV2Item { | |
id | |
} | |
} | |
}' -f project=${{ env.PROJECT_ID }} -f item=${{ env.ITEM_ID }} -f priority_field=${{ env.PRIORITY_FIELD_ID }} -f priority_value=$priority_field_value | |
fi | |
done | |
else | |
# Clear the field | |
echo "Found no priority labels => clearing the field in the Project" | |
gh api graphql -f query=' | |
mutation($project: ID!, $item: ID!, $priority_field: ID!) { | |
clearProjectV2ItemFieldValue( | |
input: { | |
projectId: $project | |
itemId: $item | |
fieldId: $priority_field | |
} | |
) { | |
projectV2Item { | |
id | |
} | |
} | |
}' -f project=${{ env.PROJECT_ID }} -f item=${{ env.ITEM_ID }} -f priority_field=${{ env.PRIORITY_FIELD_ID }} | |
fi |