Skip to content

[ADD_BACKLOG] Raw Danger! #39

[ADD_BACKLOG] Raw Danger!

[ADD_BACKLOG] Raw Danger! #39

name: Issue Templates automated Tasks
on:
issues:
types: [opened, edited]
jobs:
check_issue:
runs-on: ubuntu-latest
outputs:
issue_type: ${{ steps.detect_issue_type.outputs.issue_type }}
template_file: ${{ steps.set_template_file.outputs.template_file }}
steps:
- name: πŸ›ŽοΈ Checkout
uses: actions/checkout@v4
- id: detect_issue_type
name: πŸ” Scan issue type
run: |
issue_title="${{ github.event.issue.title }}"
if [[ "$issue_title" =~ ^\[ADD_GAME\] ]]; then
echo "issue_type=ADD_GAME" >> $GITHUB_OUTPUT
elif [[ "$issue_title" =~ ^\[UPDATE_GAME\] ]]; then
echo "issue_type=UPDATE_GAME" >> $GITHUB_OUTPUT
elif [[ "$issue_title" =~ ^\[DELETE_GAME\] ]]; then
echo "issue_type=DELETE_GAME" >> $GITHUB_OUTPUT
elif [[ "$issue_title" =~ ^\[ADD_BACKLOG\] ]]; then
echo "issue_type=ADD_BACKLOG" >> $GITHUB_OUTPUT
elif [[ "$issue_title" =~ ^\[DELETE_BACKLOG\] ]]; then
echo "issue_type=DELETE_BACKLOG" >> $GITHUB_OUTPUT
else
echo "issue_type=UNKNOWN" >> $GITHUB_OUTPUT
fi
- id: set_template_file
name: πŸ‘‰ Select the correct template for this issue
run: |
case "${{ steps.detect_issue_type.outputs.issue_type }}" in
ADD_GAME)
echo "template_file=01-add-game.yml" >> $GITHUB_OUTPUT
;;
UPDATE_GAME)
echo "template_file=02-update-game.yml" >> $GITHUB_OUTPUT
;;
DELETE_GAME)
echo "template_file=03-delete-game.yml" >> $GITHUB_OUTPUT
;;
ADD_BACKLOG)
echo "template_file=04-add-backlog.yml" >> $GITHUB_OUTPUT
;;
DELETE_BACKLOG)
echo "template_file=05-delete-backlog.yml" >> $GITHUB_OUTPUT
;;
esac
process_issue:
runs-on: ubuntu-latest
needs: check_issue
if: ${{ needs.check_issue.outputs.issue_type != 'UNKNOWN' }}
outputs:
issue_json: ${{ steps.processed.outputs.json }}
issue_type: ${{ needs.check_issue.outputs.issue_type }}
env:
ISSUE_TYPE: ${{ needs.check_issue.outputs.issue_type }}
TEMPLATE_FILE: ${{ needs.check_issue.outputs.template_file }}
steps:
- name: πŸ›ŽοΈ Checkout
uses: actions/checkout@v4
# To generate an array of all fields id and labels - example :
# [ { "id": "name", "label": "The Name of the Thing" }, { "id": "nickname", "label": "The Nickname of the Thing" }, // ... other fields ]
# Warning, yq follows JSONL specs ( https://jsonlines.org/ ) so we don't have exactly an array here
- uses: mikefarah/[email protected]
name: πŸ“° Parse YML file to extract id and labels
with:
cmd: |
yq -o=json -I=0 '.body[] | select(.type != "markdown") | {"id": .id, "label": .attributes.label}' .github/ISSUE_TEMPLATE/${{ env.TEMPLATE_FILE }} > template-keys.jsonl
- id: parse-issue
name: πŸ“ IssueOps Form Parser
uses: issue-ops/[email protected]
with:
issue-form-template: ${{ env.TEMPLATE_FILE }}
body: ${{ github.event.issue.body }}
- name: πŸ’Ύ Save result into a json file
run: |
echo '${{ steps.parse-issue.outputs.json }}' | jq '.' > original_answers.json
# https://til.codeinthehole.com/posts/about-jqs-slurp-option/
- name: πŸ”ƒ Prepare template keys file
run: |
jq -s '[.[] | {key: (.label | ascii_downcase | gsub("[^a-z0-9]"; "_") | sub("^_+|_+$"; "") | gsub("_+"; "_")), value: .id}]' template-keys.jsonl > transformed_keys.json
jq 'reduce .[] as $item ({}; . + {($item.key): $item.value})' transformed_keys.json > keys_map.json
- name: πŸ‘€ Show keys mappings
run: |
echo "$(cat keys_map.json)"
- name: 🏭 Replace Form keys by our keys
run: |
jq -s '
# Load both JSON files as an array, with the first being the data and the second being the mapping
.[0] as $data |
.[1] as $mapping |
# Apply the mapping to rename keys
$data | with_entries(.key |= ($mapping[.] // .))
' original_answers.json keys_map.json > output.json
- name: πŸ‘€ Show result
run: |
echo "$(cat output.json)"
- name: πŸ“₯ Sent result to github outputs
id: processed
run: |
json_content=$(cat output.json | jq -c)
echo "json=$json_content" >> $GITHUB_OUTPUT
magic_time:
needs: process_issue
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
issues: write
env:
OPERATION: ${{ needs.process_issue.outputs.issue_type }}
REQUEST: ${{ needs.process_issue.outputs.issue_json }}
steps:
- name: πŸ›ŽοΈ Checkout
uses: actions/checkout@v4
- name: Setup Node.js ✨
uses: actions/[email protected]
with:
node-version: "lts/*"
- name: πŸ’» Install npm packages
run: npm install better-sqlite3 --no-save
- name: πŸ’Ώ Do actions in database
run: |
node automatedTasks.mjs "$OPERATION" "$REQUEST"
- name: πŸ€– Update JSON files after this change
run: npm run generate-api-json-files
- name: πŸ’… Create Pull Request
id: cpr
uses: peter-evans/create-pull-request@v6
with:
title: "πŸ€– ${{ github.event.issue.title }}"
body: |
### Automated ${{ env.OPERATION }} Change Details
The following changes were made to the JSON files based on the issue template :
```json
${{ toJson(fromJson(env.REQUEST)) }}
```
Please review the changes. Closes #${{ github.event.issue.number }}
- name: πŸ’¬ Create comment with PR Link
if: ${{ steps.cpr.outputs.pull-request-number }}
uses: peter-evans/create-or-update-comment@v4
with:
issue-number: ${{ github.event.issue.number }}
body: |
πŸš€ A pull request has been created to address this issue:
**PR Title**: πŸ€– ${{ github.event.issue.title }}
**Link**: ${{ steps.cpr.outputs.pull-request-url }}
Please review the changes and provide your feedback.
reactions: rocket