API๋ฅผ ํตํด์ Jira Webhook ๋ฑ๋กํ๊ธฐ. ( OAuth2.0 Token์ป๊ธฐ ํฌํจ)
์๋ ํ์ธ์.
Eric์ ๋๋ค.
์ค๋ ์ ๊ฐ ์ค๋นํ ๋ด์ฉ์
Jira API๋ฅผ ํตํ Jira Webhook ๋ฑ๋กํ๊ธฐ ์ ๋๋ค.
์นํ (Webhook)์ด๋?
์นํ (Webhook)์ ํ ์์คํ ์์ ๋ค๋ฅธ ์์คํ ์ผ๋ก ์ด๋ฒคํธ ์ ๋ณด๋ฅผ ์ ๋ฌํ๋ ์๋ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์นํ ์ ์ฃผ๋ก ์น ์๋น์ค ๊ฐ์ ์ค์๊ฐ ์ํธ ์์ฉ์ ์ฌ์ฉ๋๋ฉฐ, ํน์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋๋ง๋ค ์ ๋ณด๋ฅผ ์ ๋ฌํ๋ ์ญํ ์ ํฉ๋๋ค.
์นํ ๊ฐ๋ ์ ํ๋จ์ ์ ์ ๊ฒ์๊ธ ์ฐธ์กฐํด์ฃผ์ธ์.
https://just09.tistory.com/363
์์์ ์ ์์,
์ ๋ ์ด๋ฒ์ Postman ์ ํตํด์ ์ค๋์ ๊ธ์ ์์ฑํ ์์ ์ ๋๋ค!
[๊ฐ์]
1. OAuth 2.0 Token ์ป๊ธฐ
2. ๋ด๊ฐ ์งํ์ค์ธ Jira ์ id๊ฐ ์ป๊ธฐ
3. API๋ฅผ ํตํ Webhook ๋ฑ๋กํ๊ธฐ
4. ๋ฑ๋ก๋ Webhook ํ์ธํ๊ธฐ
5. ๋ฑ๋ก๋ Webhook ์ ๊ฑฐํ๊ธฐ
1. OAuth 2.0 Token ์ป๊ธฐ
์ด๋ฒ์ ์ ๊ฐ API๋ฅผ ํตํด์ Jira API๋ฅผ ๋ฑ๋กํ๊ธฐ์ํด์๋
OAuth 2.0 Token์ด ํ์ํฉ๋๋ค.
๊ทธ๋ฌ๋ฉด ์ฐ์ Token์ ๊ฐ์ ธ์ค๊ธฐ ์ํด์ Postman์
Authorization ์ ์ ์ํด์,
Type : OAuth2.0 ์ผ๋ก ์ ์ํ๊ณ
Add authorization data๋ฅผ Reqeust Header๋ก ์ฐ์ ์ค์ ํฉ๋๋ค.(Jira๋ ์ด๋ ๊ฒ ํด์ผํจ)
๊ทธ๋ฆฌ๊ณ ๋์ Token ๊ฐ์ ์ป๊ธฐ ์ํ
์ฌ๋ฌ๊ฐ์ง ์ค๋น๋ฌผ์ด ํ์ํ๋ฐ์,
- Callback URL
- Auth URL
- Access Token URL
- Client ID
- Client Secret
- Scope
๊ฐ ํ์ํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ์ฐจ๊ทผ์ฐจ๊ทผ ํ๋์ฉ ์์๋ณด๊ฒ ์ต๋๋ค.
1.1 Callback URL
Callback URL์ OAuth 2.0 ์ธ์ฆ ๊ณผ์ ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋ ํ์ ์ฌ์ฉ์๊ฐ ๋ฆฌ๋๋ ์ ๋ URL์ ๋๋ค.
์ด URL์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฑ๋กํ ๋ OAuth ์ ๊ณต์์๊ฒ ์๋ ค์ค์ผ ํ๋ฉฐ, ์ธ์ฆ ์ฝ๋๋ ์ก์ธ์ค ํ ํฐ์ด ์ด URL๋ก ์ ๋ฌ๋ฉ๋๋ค.
์ ๋ PostMan์ ์ด์ฉํด์ ์งํํ ๊ฒ์ด๊ธฐ๋๋ฌธ์, PostMan์ด ์ ๊ณตํ๋ URL
https://getpostman.com/oauth2/callback
์ ์ฌ์ฉํ ๊ฒ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ํด๋น ๋ด์ฉ์ Jira Devolper Console ์ Authorization ๋ถ๋ถ์
๋์ผํ URL์ ์ ๋ ฅํด์ฃผ์ ์ผํฉ๋๋ค.
1.2 Auth URL
Auth URL์ ์ฌ์ฉ์๊ฐ ์ฒ์์ผ๋ก OAuth 2.0 ์ธ์ฆ์ ์์ํ ๋ ๋ฐฉ๋ฌธํ๋ URL์ ๋๋ค.
์ด URL์ ์ผ๋ฐ์ ์ผ๋ก OAuth ์ ๊ณต์์ ์น์ฌ์ดํธ์ ์์นํ๋ฉฐ,
์ฌ์ฉ์๋ ์ด๊ณณ์์ ๋ก๊ทธ์ธํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํ ์ ๊ทผ ๊ถํ์ ๋ถ์ฌํฉ๋๋ค.
์ด๋ฒ์ ์ ๋ Jira๋ฅผ ์ด์ฉํ ๊ฒ์ด๋ฏ๋ก Jira์ Auth URL์ ์ด์ฉํ ๊ฒ์ ๋๋ค.
https://auth.atlassian.com/authorize
1.3 Access Token URL
Access Token URL์ ์ธ์ฆ ์ฝ๋๋ฅผ ์ก์ธ์ค ํ ํฐ์ผ๋ก ๊ตํํ๋ ๊ณผ์ ์์ ์ฌ์ฉ๋๋ URL์ ๋๋ค.
์ด URL์ ์ธ์ฆ ์ฝ๋์ ํด๋ผ์ด์ธํธ ์ ๋ณด๋ฅผ POST ์์ฒญ์ผ๋ก ๋ณด๋ด๋ฉด, ์ก์ธ์ค ํ ํฐ์ด ๋ฐํ๋ฉ๋๋ค.
์ด๋ฒ์ ์ ๋ Jira๋ฅผ ์ด์ฉํ ๊ฒ์ด๋ฏ๋ก Jira์ Access Token URL์ ์ด์ฉํ ๊ฒ์ ๋๋ค.
https://auth.atlassian.com/oauth/token
Clinet ID ์ Client Secret ์ ๊ฒฝ์ฐ์๋
Jira Developer Console์ Settings ์์ ํ๋จ๊ณผ ๊ฐ์ด ํ์ธํ์ ์
๋ฃ์ผ์๋ฉด๋ฉ๋๋ค.
1.4 Client ID
Client ID๋ OAuth 2.0 ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ณํ๋ ๊ณ ์ ํ ์๋ณ์์ ๋๋ค.
์ด ID๋ ์ ํ๋ฆฌ์ผ์ด์ ์ OAuth ์ ๊ณต์์ ๋ฑ๋กํ ๋ ์์ฑ๋ฉ๋๋ค.
์์ ์ฌ์ง ๊ฐ์ ์ ๋ ฅํด์ค๋๋ค.
1.5 Client Secret
Client Secret์ ํด๋ผ์ด์ธํธ ID์ ํจ๊ป ์ฌ์ฉ๋์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์์ ํ์ธํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์ด ๊ฐ์ ๋ณด์์ ์ ์งํด์ผ ํ๋ฉฐ, ์ ๋ ์ฌ์ฉ์์๊ฒ ๋ ธ์ถ๋์ด์๋ ์๋ฉ๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก ์์ ์ฌ์ง ๊ฐ์ ์ ๋ ฅํด์ค๋๋ค.
1.6 Scope
Scope๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ถ์ฌ๋ ์ ์๋ ๊ถํ์ ๋ฒ์๋ฅผ ์ ์ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ์ฌ์ฉ์์ ์ด๋ฉ์ผ, ํ๋กํ ์ ๋ณด, ์ฌ์ง ๋ฑ์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ ์์ฒญํ ์ ์์ต๋๋ค.
Scope๋ ์ผ๋ฐ์ ์ผ๋ก ๊ณต๋ฐฑ์ด๋ ์ผํ๋ก ๊ตฌ๋ถ๋ ๋ฌธ์์ด๋ก ํํ๋ฉ๋๋ค.
์ ๋ ์ด๋ฒ ํ ํฐ์ผ๋ก ์ฌ๋ฌ๊ฐ์ง ํ๊ณ ์ถ์ด์ Classic Scopes ๋ ๋ชจ๋๋ค ๋ฑ๋กํ์์ต๋๋ค.
read:jira-work manage:jira-project manage:jira-configuration read:jira-user write:jira-work manage:jira-webhook manage:jira-data-provider
์ํ์๋ Scope๋ฅผ ์ฐพ์ผ์๋ ค๋ฉด
ํ๋จ์ ๋ด์ฉ ๋ฐ ๋งํฌ๋ฅผ ์ฐธ์กฐ!
https://developer.atlassian.com/cloud/jira/platform/scopes-for-oauth-2-3LO-and-forge-apps/
์ด๋ ๊ฒ ํ๋ฉด OAuth2.0 Token์ ์ป์ ์์ต๋๋ค.
2. ๋ด๊ฐ ์งํ์ค์ธ Jira ์ id๊ฐ ์ป๊ธฐ
์ฐ์ ์ด๋ฒ์ API๋ฅผ ํตํด์ Webhook์ ๋ฑ๋กํ๊ธฐ ์ํด์๋
๋ด๊ฐ ์ฌ์ฉ์ค์ธ Jira์ id๊ฐ์ด ํ์ํฉ๋๋ค.
์ ํฌ๊ฐ ์ฌ์ฉํ API๋
https://api.atlassian.com/ex/jira/{jira_id}/rest/api/2/webhook
์ด๋ฌํ ํ์์ธ๋ฐ,
์ด๋ฅผ ์ํด์ jira-id์ ์ป๊ธฐ์ํด์๋
์ฐ์ ์์ ๋ฐ๊ธ๋ฐ์๋ Token์ ํตํด์ ํ๋จ์ API๋ฅผ ํตํด์ ๊ฐ์ ธ์ต๋๋ค.
GET
https://api.atlassian.com/oauth/token/accessible-resources
๊ทธ๋ฌ๋ฉด ํ๋จ์ ์ฌ์ง์ฒ๋ผ
์ ๊ฐ ๊ฐ์ง Token์ผ๋ก ์ ์์ด ๊ฐ๋ฅํ Jira ๋ชฉ๋ก์ด ๋์ต๋๋ค.
์ฌ๊ธฐ์์ ์ฌ์ง์์์ ๋ ธ๋๋ฐ์ค์ ์๋
์ ๊ฐ ์ํ๋ id๊ฐ์ ๊ฐ์ ธ์ต๋๋ค.
3. API๋ฅผ ํตํ Webhook ๋ฑ๋กํ๊ธฐ
๋ง์ง๋ง ๋จ๊ณ์ ๋๋ค.
์ด์
POST
https://api.atlassian.com/ex/jira/{jira_id}/rest/api/2/webhook
๋ฅผ ํตํด์ Webhook์ ๋ฑ๋กํด์ค๋๋ค.
์ด๋, Token์ ์์์ ๋ฐ๊ธ๋ฐ์๋ Token์ ์ฌ์ฉํด์ฃผ๊ณ ,
์ค์ํ๊ฑด, Body๊ฐ์
ํ๋จ์ ๋ด์ฉ์ ์ ๋ ฅํด์ฃผ์ด์ผํฉ๋๋ค.
{
"url": "https://helloworld.com/notification/jira", // webhook์ ํตํด์ API๋ฅผ ๋ฐ์ url์ฃผ์
"webhooks": [
{
"events": [ // ์ด๋ค Event๋ค์ webhook์ ํตํด์ ์ ๋ฌ๋ฐ์์ง
"jira:issue_created",
"jira:issue_updated",
"comment_created"
],
"jqlFilter": "project = KAN" // ์ด๋ค Project์์ ํด๋น webhook์ ๋์์ํฌ์ง
}
]
}
3.1 url
์ด URL์ Jira์์ ํน์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ์๋ฆผ์ ๋ฐ์ ์ธ๋ถ ์๋น์ค์ URL์ ๋๋ค.
3.2 webhooks
์ด ๋ฐฐ์ด์ ํ๋ ์ด์์ ์นํ ์ค์ ์ ํฌํจํฉ๋๋ค.
๊ฐ ์นํ ์ ์ด๋ค ์ด๋ฒคํธ์ ๋ฐ์ํ ์ง์ ์ด๋ค ํํฐ๋ฅผ ์ฌ์ฉํ ์ง๋ฅผ ์ ์ํฉ๋๋ค.
3.3 events
์ด ๋ฐฐ์ด์ ์นํ ์ด ๋ฐ์ํ Jira ์ด๋ฒคํธ์ ๋ชฉ๋ก์ ๋๋ค.
- jira:issue_created: ์ด์๊ฐ ์๋ก ์์ฑ๋์์ ๋
- jira:issue_updated: ๊ธฐ์กด ์ด์๊ฐ ์ ๋ฐ์ดํธ๋์์ ๋
- comment_created: ์๋ก์ด ๋๊ธ์ด ์์ฑ๋์์ ๋
3.4 jqlFilter
JQL(Jira Query Language) ํํฐ๋ ์นํ ์ด ๋ฐ์ํ ์ด์๋ฅผ ์ขํ์ฃผ๋ ์ญํ ์ ํฉ๋๋ค.
์ด ํํฐ์ ๋ง๋ ์ด์์๋ง ์นํ ์ด ์๋ํฉ๋๋ค.
์์: "project = KAN"์ KAN ํ๋ก์ ํธ์ ์ํ ์ด์์๋ง ์นํ ์ด ์๋ํ๋๋ก ์ค์ ํฉ๋๋ค.
์ด๋ ๊ฒ ๋๋ฉด Webhook์ด ๋ฑ๋ก์ด ์๋ฃ๋์์ต๋๋ค.
4. ๋ฑ๋ก๋ Webhook ํ์ธํ๊ธฐ
์ด์ ์นํ ์ด ๋ฑ๋ก๋์์ผ๋ ํ์ธํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๋ฑ๋ก๋ ์นํ ์ ํ์ธ์ ํ๊ธฐ ์ํด์๋
GET
https://api.atlassian.com/ex/jira/{jira_id}/rest/api/2/webhook
์ ํตํด์ Token์ ์ฌ์ฉํด์ ์์ฒญํ๋ฉด
ํ๋จ๊ณผ ๊ฐ์ด ๋ฑ๋ก๋ Webhook์ Array ํํ๋ก ๋ฐ์ ๋ณผ ์ ์์ต๋๋ค.
5. ๋ฑ๋ก๋ Webhook ์ ๊ฑฐํ๊ธฐ
๋ฑ๋ก๋ Webhook์ ์๋จ์ ์ฌ์ง์ฒ๋ผ ์กฐํ ํ๊ณ ๋์,
values์ ๊ฐ์ค id ๊ฐ์ด ํ์ํฉ๋๋ค
DELETE
https://api.atlassian.com/ex/jira/{jira_id}/rest/api/2/webhook
๋ฅผ ํตํด์
Body ๊ฐ์ ์ง์์ค Webhook์ id๊ฐ๋ค์ ์ ๋ ฅํฉ๋๋ค.
{"webhookIds" : [
9,10 // id๊ฐ์ ์
๋ ฅ
]}
๊ทธ๋ฌ๋ฉด ์๋จ์ ์ฌ์ง์ฒ๋ผ
202 Accepted ๊ฐ ๋๋ฉด์ Webhook์ด ์ง์์ง๊ฒ์ ํ์ธ ํ์ค ์ ์์ต๋๋ค.
์ค๋์ Jira์ API๋ฅผ ํตํด์ Webhook์ ๋ฑ๋ก, ์ญ์ , ์กฐํ ๋ฅผ ํด๋ณด์๋๋ฐ์,
์ ๊ธ์ด ๋ง์ ๋์์ด ๋์ จ๊ธฐ๋ฅผ ๋ฐ๋ผ๋ฉฐ
๋ค์์ ์ ๋ ๋ ์ข์ ์ ๋ณด๋ก ์ฐพ์๋ต๊ฒ ์ต๋๋ค.
์ด์ ๊ฐ๋ฐ์ Eric์ด์์ต๋๋ค.
๊ฐ์ฌํฉ๋๋ค.
์ฐธ๊ณ ์๋ฃ
https://developer.atlassian.com/cloud/jira/platform/rest/v2/api-group-webhooks/#api-group-webhooks
'๐ป ๊ฐ๋ฐ๊ณต๋ถ > Web' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Eric's Web] NGINX ์ค์น ๋ฐ CORS ์ค์ ๋ฐฉ๋ฒ (0) | 2024.06.22 |
---|---|
[Eric's CS] ์นํ (WebHook) ? ๐ฃ (0) | 2023.04.06 |