diff --git "a/.github/ISSUE_TEMPLATE/\360\237\215\200\353\213\244\354\206\234-\354\235\264\354\212\210-\355\205\234\355\224\214\353\246\277.yml" "b/.github/ISSUE_TEMPLATE/\360\237\215\200\353\213\244\354\206\234-\354\235\264\354\212\210-\355\205\234\355\224\214\353\246\277.yml" new file mode 100644 index 0000000..9b84969 --- /dev/null +++ "b/.github/ISSUE_TEMPLATE/\360\237\215\200\353\213\244\354\206\234-\354\235\264\354\212\210-\355\205\234\355\224\214\353\246\277.yml" @@ -0,0 +1,42 @@ +name: "๐Ÿ€๋‹ค์†œ-์ด์Šˆ-ํ…œํ”Œ๋ฆฟ" +description: "ํ•ด๋‹น ์ด์Šˆ ์ƒ์„ฑ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”! (2025.08.08 update)" +labels: [FEAT] +title: "[feat] ๊ฐœ๋ฐœ ํƒ€์ดํ‹€" +body: + - type: input + id: parentKey + attributes: + label: "๐ŸŽŸ๏ธ ์ƒ์œ„ ์ž‘์—… (Ticket Number)" + description: "์ƒ์œ„ ์ž‘์—…์˜ Ticket Number๋ฅผ ๊ธฐ์ž…ํ•ด์ฃผ์„ธ์š”" + placeholder: "DASOMFE-00 ๋˜๋Š” DASOMBE-00" + validations: + required: true + + - type: dropdown + id: projectKey + attributes: + label: "๐Ÿ“ฆ ํ”„๋กœ์ ํŠธ" + description: "์ด์Šˆ๋ฅผ ์ƒ์„ฑํ•  Jira ํ”„๋กœ์ ํŠธ๋ฅผ ์„ ํƒํ•˜์„ธ์š”" + options: + - DASOMFE + - DASOMBE + validations: + required: true + + - type: textarea + id: purpose + attributes: + label: "๐ŸŽฏ ๋ชฉ์ (Purpose)" + description: "ํ•ด๋‹น Issue๊ฐ€ ๋ฐœ์ƒํ•œ ์›์ธ๊ณผ ๋ฐฐ๊ฒฝ์„ ์„ค๋ช…ํ•œ๋‹ค." + placeholder: "์˜ˆ: ํšŒ์› ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ์œ„ํ•œ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ํ•„์š”" + validations: + required: true + + - type: textarea + id: description + attributes: + label: "๐Ÿ“ ์ƒ์„ธ ๋‚ด์šฉ(Description)" + description: "๊ตฌํ˜„ํ•  ๊ธฐ๋Šฅ ๋˜๋Š” ์ˆ˜์ • ์‚ฌํ•ญ์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ์„ค๋ช…" + placeholder: "์˜ˆ: ์ด๋ฉ”์ผ ๋ฐ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ๊ฐ’ ๊ฒ€์ฆ ๋กœ์ง ์ถ”๊ฐ€, OAuth ์—ฐ๋™ ๊ฒ€ํ† " + validations: + required: true diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..49613f9 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,31 @@ +# [ํƒœ๊ทธ] ์ œ๋ชฉ + +(์˜ˆ: [feat] ์‚ฌ์šฉ์ž ์ธ์ฆ ๊ธฐ๋Šฅ ์ถ”๊ฐ€) + +## Issue + +- ์˜ˆ์‹œ: #111, #112 + (ํ•ด๋‹น PR๊ณผ ๊ด€๋ จ๋œ ์ด์Šˆ ๋ฒˆํ˜ธ๋ฅผ ๋ช…์‹œํ•˜์—ฌ ์ถ”์  ์šฉ์ด์„ฑ์„ ํ™•๋ณด) + +## ๋ณ€๊ฒฝ ๋‚ด์šฉ + +- ์ด๋ฒˆ PR์—์„œ ์–ด๋–ค ๋ณ€๊ฒฝ์ด ์ด๋ฃจ์–ด์กŒ๋Š”์ง€ ๊ฐ„๋žตํ•˜๊ฒŒ ๊ธฐ์ˆ ํ•ฉ๋‹ˆ๋‹ค. + (์˜ˆ: ๊ธฐ์กด ๋กœ๊ทธ์ธ API์— JWT ๊ธฐ๋ฐ˜ ์ธ์ฆ ๋กœ์ง ์ถ”๊ฐ€) + +## ์ฒดํฌ๋ฆฌ์ŠคํŠธ + +- PR์„ ์ œ์ถœํ•˜๊ธฐ ์ „์— ๋‹ค์Œ ์‚ฌํ•ญ๋“ค์„ ํ™•์ธํ•ด์ฃผ์„ธ์š”: + +- [ ] ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๊ฐ€ ์ปจ๋ฒค์…˜์„ ๋”ฐ๋ฅด๋Š”๊ฐ€? +- [ ] ๋ฆฐํŠธ ๊ฒ€์‚ฌ๋ฅผ ํ†ต๊ณผํ–ˆ๋Š”๊ฐ€? (`npm run lint` or `npm run lint:fix`) +- [ ] ๋กœ์ปฌ์—์„œ ๋นŒ๋“œ๊ฐ€ ์„ฑ๊ณตํ•˜๋Š”๊ฐ€? (`npm run build`) + +## ํ…Œ์ŠคํŠธ + +- [ ] ๋กœ์ปฌ์—์„œ ํ…Œ์ŠคํŠธ ์™„๋ฃŒ +- [ ] ๊ธฐ์กด ๊ธฐ๋Šฅ์— ์˜ํ–ฅ ์—†์Œ ํ™•์ธ +- [ ] ๋‹ค์–‘ํ•œ ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ…Œ์ŠคํŠธ (ํ•„์š”์‹œ) + +## ๋ฆฌ๋ทฐ ์š”๊ตฌ์‚ฌํ•ญ(ํ•„์š”์‹œ) + +- ํŠน๋ณ„ํžˆ ๋ฆฌ๋ทฐํ•ด์ฃผ๊ธธ ์›ํ•˜๋Š” ๋ถ€๋ถ„ diff --git a/.github/workflows/close-jira-issue.yml b/.github/workflows/close-jira-issue.yml new file mode 100644 index 0000000..5d4a0b2 --- /dev/null +++ b/.github/workflows/close-jira-issue.yml @@ -0,0 +1,32 @@ +name: Close Jira issue +on: + issues: + types: + - closed + +jobs: + close-issue: + name: Close Jira issue + runs-on: ubuntu-latest + + steps: + - name: Login to Jira + uses: atlassian/gajira-login@v3 + env: + JIRA_BASE_URL: ${{ secrets.JIRA_URL }} + JIRA_API_TOKEN: ${{ secrets.JIRA_API_TOKEN }} + JIRA_USER_EMAIL: ${{ secrets.JIRA_EMAIL }} + + - name: Extract Jira issue key from GitHub issue title + id: extract-key + run: | + ISSUE_TITLE="${{ github.event.issue.title }}" + JIRA_KEY=$(echo "$ISSUE_TITLE" | grep -oE '[A-Z]+-[0-9]+') + echo "JIRA_KEY=$JIRA_KEY" >> $GITHUB_ENV + + - name: Close Jira issue + if: env.JIRA_KEY != '' + uses: atlassian/gajira-transition@v3 + with: + issue: ${{ env.JIRA_KEY }} + transition: ์™„๋ฃŒ diff --git a/.github/workflows/create-jira-issue.yml b/.github/workflows/create-jira-issue.yml new file mode 100644 index 0000000..454c6ab --- /dev/null +++ b/.github/workflows/create-jira-issue.yml @@ -0,0 +1,77 @@ +name: Create Jira issue +on: + issues: + types: + - opened +jobs: + create-issue: + name: Create Jira issue + runs-on: ubuntu-latest + steps: + - name: Login + uses: atlassian/gajira-login@v3 + env: + JIRA_BASE_URL: ${{ secrets.JIRA_URL }} + JIRA_API_TOKEN: ${{ secrets.JIRA_API_TOKEN }} + JIRA_USER_EMAIL: ${{ secrets.JIRA_EMAIL }} + + - name: Checkout main code + uses: actions/checkout@v4 + with: + ref: main + + - name: Issue Parser + uses: stefanbuck/github-issue-parser@v3 + id: issue-parser + with: + template-path: .github/ISSUE_TEMPLATE/๐Ÿ€๋‹ค์†œ-์ด์Šˆ-ํ…œํ”Œ๋ฆฟ.yml + + - name: Log Issue Parser + run: | + echo '${{ steps.issue-parser.outputs.issueparser_parentKey }}' + echo '${{ steps.issue-parser.outputs.__ticket_number }}' + echo '${{ steps.issue-parser.outputs.jsonString }}' + + - name: Convert markdown to Jira Syntax + uses: peter-evans/jira2md@v1 + id: md2jira + with: + input-text: | + ### Github Issue Link + - ${{ github.event.issue.html_url }} + + ${{ github.event.issue.body }} + mode: md2jira + + - name: Create Issue + id: create + uses: atlassian/gajira-create@v3 + with: + project: DASOMBE + issuetype: Task + summary: "${{ github.event.issue.title }}" + description: "${{ steps.md2jira.outputs.output-text }}" + fields: | + { + "parent": { + "key": "${{ steps.issue-parser.outputs.issueparser_parentKey}}" + } + } + + - name: Log created issue + run: echo "Jira Issue ${{ steps.issue-parser.outputs.parentKey }}/${{ steps.create.outputs.issue }} was created" + + - name: Update issue title + uses: actions-cool/issues-helper@v3 + with: + actions: "update-issue" + token: ${{ secrets.GITHUB_TOKEN }} + title: "[${{ steps.create.outputs.issue }}] ${{ github.event.issue.title }}" + + - name: Add comment with Jira issue link + uses: actions-cool/issues-helper@v3 + with: + actions: "create-comment" + token: ${{ secrets.GITHUB_TOKEN }} + issue-number: ${{ github.event.issue.number }} + body: "Jira Issue Created: [${{ steps.create.outputs.issue }}](${{ secrets.JIRA_URL }}/browse/${{ steps.create.outputs.issue }})"