Update Discussion List in README #103
This file contains hidden or 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: Update Discussion List in README | |
| on: | |
| workflow_dispatch: | |
| discussion: | |
| types: [created, edited, answered, unanswered, labeled, unlabeled, category_changed] # 필요에 맞게 줄여도 됨 | |
| discussion_comment: | |
| types: [created, edited, deleted] | |
| permissions: | |
| contents: write # README 수정/커밋 | |
| discussions: read # /discussions API 읽기 | |
| jobs: | |
| update-readme: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| # schedule 트리거에서도 안전하게 owner/repo 설정 (env로 전달) | |
| - name: Set OWNER/REPO env | |
| shell: bash | |
| run: | | |
| echo "OWNER=${GITHUB_REPOSITORY%/*}" >> "$GITHUB_ENV" | |
| echo "REPO=${GITHUB_REPOSITORY#*/}" >> "$GITHUB_ENV" | |
| # (선택) 디버그: 현재 브랜치와 파일 확인 | |
| - name: Debug info | |
| shell: bash | |
| run: | | |
| echo "Branch ref: $GITHUB_REF" | |
| ls -al .github/workflows || true | |
| # Discussions JSON 저장(표준출력 직접 파이프 X, 파일에 안전 저장) | |
| - name: Save discussions JSON to file | |
| id: save_json | |
| uses: octokit/request-action@v2.x | |
| with: | |
| route: GET /repos/{owner}/{repo}/discussions | |
| owner: ${{ env.OWNER }} | |
| repo: ${{ env.REPO }} | |
| per_page: 100 | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Write JSON to /tmp/discussions.json | |
| shell: bash | |
| run: | | |
| set -euo pipefail | |
| run: | | |
| set -euo pipefail | |
| # 따옴표 붙은 heredoc: 안의 내용이 그대로 파일로 저장됨 (셸/변수/따옴표 영향 없음) | |
| cat > /tmp/discussions.json <<'JSON_EOF' | |
| ${{ steps.save_json.outputs.data }} | |
| JSON_EOF | |
| # 최신 활동순( updated_at desc ) 상위 5개 표 생성 | |
| - name: Build discussions table file (latest activity + labels only) | |
| shell: bash | |
| run: | | |
| set -euo pipefail | |
| { | |
| echo '| Title | Labels | Comments |' | |
| echo '|-------|--------|----------|' | |
| jq -r ' | |
| # 최신 활동(updated_at) 기준 내림차순 → 상위 5개 | |
| sort_by(.updated_at) | reverse | |
| | .[:5] | |
| | .[] | |
| # 라벨 문자열 만들기 (최대 5개, 초과 시 +N) | |
| | ( | |
| (.labels // []) | |
| | map(.name) | |
| | unique | |
| | (if length > 5 then .[0:5] + ["+" + ((length-5)|tostring)] else . end) | |
| | join(", ") | |
| ) as $labels | |
| # 마크다운 표 한 줄 (제목의 |/개행은 공백으로 치환) | |
| | "| [\(.title | gsub("[|\r\n]"; " "))](\(.html_url)) | \($labels) | \(.comments) |" | |
| ' /tmp/discussions.json | |
| } > /tmp/discussions_table.md | |
| # CRLF 방지 | |
| tr -d '\r' < /tmp/discussions_table.md > /tmp/discussions_table.unix && mv /tmp/discussions_table.unix /tmp/discussions_table.md | |
| # (선택) 미리보기 | |
| echo "Generated table:" && cat /tmp/discussions_table.md | |
| # README 마커 사이만 교체 — awk + getline (system/cat 사용 안 함) | |
| - name: Replace discussions block in README.md | |
| shell: bash | |
| run: | | |
| set -euo pipefail | |
| # 마커 존재 확인 | |
| grep -q "<!-- discussions-list-start -->" README.md | |
| grep -q "<!-- discussions-list-end -->" README.md | |
| # 혹시 모를 CRLF 제거(줄바꿈 깨짐 방지) | |
| tr -d '\r' < /tmp/discussions_table.md > /tmp/discussions_table_unix.md | |
| # README를 "마커 앞부분"과 "마커 뒷부분"으로 분리 | |
| sed -n '1,/<!-- discussions-list-start -->/p' README.md > /tmp/readme_top.md | |
| sed -n '/<!-- discussions-list-end -->/,$p' README.md > /tmp/readme_bottom.md | |
| # 새 표로 사이를 정확히 재구성 (여분 문자/따옴표 제거 효과) | |
| { | |
| cat /tmp/readme_top.md | |
| cat /tmp/discussions_table_unix.md | |
| cat /tmp/readme_bottom.md | |
| } > README.tmp.md | |
| mv README.tmp.md README.md | |
| - name: Commit and push | |
| shell: bash | |
| run: | | |
| set -euo pipefail | |
| git config user.name "github-actions[bot]" | |
| git config user.email "github-actions[bot]@users.noreply.github.com" | |
| git add README.md | |
| if ! git diff --cached --quiet; then | |
| git commit -m "Update Discussions list" | |
| git push | |
| else | |
| echo "No changes to commit" | |
| fi |