Skip to main content

URL ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ GitHub ์•ฑ ๋“ฑ๋ก

URL ์ฟผ๋ฆฌ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฏธ๋ฆฌ ์„ ํƒํ•œ ํŠน์ • ๊ตฌ์„ฑ์œผ๋กœ ์ƒˆ GitHub App์„(๋ฅผ) ๋น ๋ฅด๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

GitHub Apps

๋“ฑ๋ก์„ ์œ„ํ•œ URL ๋งค๊ฐœ ๋ณ€์ˆ˜ ์ •๋ณด

URL ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ GitHub App ๋“ฑ๋ก์˜ ๊ตฌ์„ฑ ์„ค์ •์„ ๋ฏธ๋ฆฌ ์„ ํƒํ•˜๊ณ  ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์™€ ์‚ฌ์šฉ์ž ์ง€์ • ๋งํฌ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งํฌ๋Š” ์‚ฌ์šฉ์ž๋ฅผ GitHub App ๋“ฑ๋ก ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์•ฑ ์„ค์ •์€ URL์— ํฌํ•จ๋œ URL ๋งค๊ฐœ ๋ณ€์ˆ˜์— ๋”ฐ๋ผ ๋ฏธ๋ฆฌ ์ฑ„์›Œ์ง‘๋‹ˆ๋‹ค.

์ด ๋ฐฉ๋ฒ•์€ ๊ณ ๊ฐ์ด ํŠน์ • ์‚ฌ์–‘์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ์ธ ๊ณ„์ • ๋˜๋Š” ์กฐ์ง์—์„œ ์•ฑ์„ ์„ค์ •ํ•˜๋ ค๋Š” ํ†ตํ•ฉ์—…์ฒด ๋˜๋Š” GitHub Marketplace์—์„œ ์•ฑ์„ ์„ค์น˜ํ•  ์ˆ˜ ์—†๋Š” GitHub Enterprise Server์„(๋ฅผ) ์‚ฌ์šฉํ•˜๋Š” ๊ณ ๊ฐ์—๊ฒŒ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋˜๋Š” GitHub App ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์—์„œ GitHub ์•ฑ ๋“ฑ๋ก์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

์ฐธ๊ณ  ํ•ญ๋ชฉ

์ด ๋ฌธ์„œ์—๋Š” github.com ๋„๋ฉ”์ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ช…๋ น์ด๋‚˜ ์˜ˆ์ œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. octocorp.ghe.com์™€(๊ณผ) ๊ฐ™์€ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์—์„œ GitHub์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฟผ๋ฆฌ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ง€์ • ๊ตฌ์„ฑ URL ๋งŒ๋“ค๊ธฐ

๊ฐœ์ธ ๋˜๋Š” ์กฐ์ง ๊ณ„์ •์—์„œ GitHub App์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ง€์ • ๊ตฌ์„ฑ URL์„ ๋งŒ๋“ค๋ ค๋ฉด ๋‹ค์Œ ๊ธฐ๋ณธ URL ๋‹ค์Œ์— ์ฟผ๋ฆฌ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  • ๊ฐœ์ธ ๊ณ„์ •์— ์•ฑ์„ ๋“ฑ๋กํ•˜๋ ค๋ฉด URL ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ https://github.com/settings/apps/new์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ์กฐ์ง ๊ณ„์ •์— ์•ฑ์„ ๋“ฑ๋กํ•˜๋ ค๋ฉด URL ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ https://github.com/organizations/ORGANIZATION/settings/apps/new์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ORGANIZATION์„(๋ฅผ) ๊ณ ๊ฐ์ด ์•ฑ์„ ๋“ฑ๋กํ•˜๋ ค๋Š” ์กฐ์ง ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
  • ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ๊ณ„์ •์— ์•ฑ์„ ๋“ฑ๋กํ•˜๋ ค๋ฉด URL ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ https://github.com/enterprises/ENTERPRISE/settings/apps/new์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ENTERPRISE๋ฅผ ๊ณ ๊ฐ์ด ์•ฑ์„ ๋“ฑ๋กํ•˜๋ ค๋Š” ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

์•ฑ์„ ๋“ฑ๋กํ•˜๋Š” ์‚ฌ๋žŒ์€ ์•ฑ์„ ์ œ์ถœํ•˜๊ธฐ ์ „์— ์•ฑ ๋“ฑ๋ก ํŽ˜์ด์ง€์—์„œ ๋ฏธ๋ฆฌ ์„ ํƒ๋œ ๊ฐ’์„ ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. URL ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด์— ํ•„์ˆ˜ ๊ฐ’์— ๋Œ€ํ•œ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ(์˜ˆ: name) ์•ฑ์„ ๋“ฑ๋กํ•˜๋Š” ์‚ฌ๋žŒ์€ ์•ฑ์„ ๋“ฑ๋กํ•˜๊ธฐ ์ „์— ๊ฐ’์„ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ URL์€ ๊ฐœ์ธ ๊ณ„์ •์—์„œ octocat-github-app(์ด)๋ผ๊ณ  ๋ช…๋ช…๋œ ์ƒˆ ๊ณต๊ฐœ ์•ฑ์„ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ URL์€ ์„ค๋ช… ๋ฐ ์ฝœ๋ฐฑ URL์„ ๋ฏธ๋ฆฌ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ checks์— ๋Œ€ํ•œ ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ ๊ถŒํ•œ์„ ์„ ํƒํ•˜๊ณ , webhook_active ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›นํ›„ํฌ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ณ , check_run ๋ฐ check_suite ์›นํ›„ํฌ ์ด๋ฒคํŠธ๋ฅผ ๊ตฌ๋…ํ•˜๊ณ , ์„ค์น˜ํ•˜๋Š” ๋™์•ˆ ์‚ฌ์šฉ์ž ๊ถŒํ•œ ๋ถ€์—ฌ(OAuth)๋ฅผ ์š”์ฒญํ•˜๋Š” ์˜ต์…˜์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

https://github.com/settings/apps/new?name=octocat-github-app&description=An%20Octocat%20App&callback_urls[]=https://example.com&request_oauth_on_install=true&public=true&checks=write&webhook_active=true&events[]=check_run&events[]=check_suite

GitHub App ๊ตฌ์„ฑ ๋งค๊ฐœ ๋ณ€์ˆ˜

๋‹ค์Œ ์ฟผ๋ฆฌ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ GitHub App ๋“ฑ๋ก์— ๋Œ€ํ•œ ํŠน์ • ๊ตฌ์„ฑ์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์•ฑ ์ด๋ฆ„์„ "octocat-github-app"์œผ๋กœ ์ง€์ •ํ•˜๋ฉด ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด์— name=octocat-github-app์ด(๊ฐ€) ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

๋งค๊ฐœ ๋ณ€์ˆ˜ ์ด๋ฆ„Type์„ค๋ช…
namestringGitHub App์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์•ฑ์— ๋ช…ํ™•ํ•˜๊ณ  ๊ฐ„๊ฒฐํ•œ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ๋˜๋Š” ์กฐ์ง ์ด๋ฆ„์ด ์•„๋‹Œ ๊ฒฝ์šฐ ์•ฑ์˜ ์ด๋ฆ„์€ ๊ธฐ์กด GitHub ์‚ฌ์šฉ์ž์™€ ๋™์ผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ†ตํ•ฉ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์•ฑ ์ด๋ฆ„์˜ ์Šฌ๋Ÿฌ๊ทธ ๋ฒ„์ „์ด ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
descriptionstringGitHub App์— ๋Œ€ํ•œ ์„ค๋ช…์ž…๋‹ˆ๋‹ค.
urlstringGitHub App์˜ ์›น ์‚ฌ์ดํŠธ ํ™ˆํŽ˜์ด์ง€์˜ ์ „์ฒด URL์ž…๋‹ˆ๋‹ค.
callback_urlsarray of strings๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์„ค์น˜ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•œ ํ›„ ๋ฆฌ๋””๋ ‰์…˜ํ•  ์ „์ฒด URL์ž…๋‹ˆ๋‹ค. ์ตœ๋Œ€ 10๊ฐœ์˜ ์ฝœ๋ฐฑ URL์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ URL์€ ์•ฑ์—์„œ ์‚ฌ์šฉ์ž ์•ก์„ธ์Šค ํ† ํฐ์„ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋“ค ๋“ค์–ด callback_urls[]=https://example.com&callback_urls[]=https://example-2.com์ž…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์‚ฌ์šฉ์ž ๊ถŒํ•œ ๋ถ€์—ฌ ์ฝœ๋ฐฑ URL ์ •๋ณด์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.
request_oauth_on_installboolean์•ฑ์—์„œ OAuth ํ๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ๋žŒ๋“ค์ด ์•ฑ์„ ์„ค์น˜ํ•  ๋•Œ ์•ฑ์— ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์ด ์˜ต์…˜์„ true๋กœ ์„ค์ •ํ•˜์—ฌ ๋‹จ๊ณ„๋ฅผ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์˜ต์…˜์„ ์„ ํƒํ•˜๋ฉด setup_url์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋˜๊ณ  ์‚ฌ์šฉ์ž๋Š” ์•ฑ์„ ์„ค์น˜ํ•œ ํ›„ callback_url๋กœ ๋ฆฌ๋””๋ ‰์…˜๋ฉ๋‹ˆ๋‹ค.
setup_urlstring์„ค์น˜ ํ›„ ์•ฑ์— ์ถ”๊ฐ€ ์„ค์ •์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด GitHub App์„ ์„ค์น˜ํ•œ ํ›„ ๋ฆฌ๋””๋ ‰์…˜ํ•  ์ „์ฒด URL์ž…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์„ค์น˜ URL ์ •๋ณด์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.
setup_on_updateboolean์˜ˆ๋ฅผ ๋“ค์–ด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๊ฐ€ ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ์ œ๊ฑฐ๋œ ํ›„ ์„ค์น˜๊ฐ€ ์—…๋ฐ์ดํŠธ๋  ๋•Œ ์‚ฌ์šฉ์ž๋ฅผ ์„ค์ • URL๋กœ ๋ฆฌ๋””๋ ‰์…˜ํ•˜๋ ค๋ฉด true๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
publicbooleanGitHub App์„ ๋ˆ„๊ตฌ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ true๋กœ ์„ค์ •ํ•˜๊ณ  ์•ฑ ์†Œ์œ ์ž๋งŒ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ false๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋งค๊ฐœ ๋ณ€์ˆ˜๋Š” ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ฐ€ ์†Œ์œ ํ•œ ์•ฑ์—๋Š” ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
webhook_activeboolean์›นํ›„ํฌ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด true๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์›นํ›„ํฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
webhook_urlstring์›นํ›„ํฌ ์ด๋ฒคํŠธ ํŽ˜์ด๋กœ๋“œ๋ฅผ ๋ณด๋‚ด๋ ค๋Š” ์ „์ฒด URL์ž…๋‹ˆ๋‹ค.
eventsarray of strings์›นํ›„ํฌ ์ด๋ฒคํŠธ์ž…๋‹ˆ๋‹ค. ์ƒˆ GitHub App์„ ๋“ฑ๋กํ•  ๋•Œ ์ด๋ฒคํŠธ๋ฅผ ์„ ํƒํ•˜๊ธฐ ์ „์— ์ผ๋ถ€ ์›นํ›„ํฌ ์ด๋ฒคํŠธ์—๋Š” ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ read ๋˜๋Š” write ๊ถŒํ•œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ GitHub App ์›นํ›„ํฌ ์ด๋ฒคํŠธ ์„น์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”. ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด์—์„œ ์—ฌ๋Ÿฌ ์ด๋ฒคํŠธ๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋“ค ๋“ค์–ด events[]=public&events[]=label์ž…๋‹ˆ๋‹ค.
single_file_namestring์ด๋Š” ์•ฑ์ด ๋ชจ๋“  ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ ๋‹จ์ผ ํŒŒ์ผ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์ข์€ ๋ฒ”์œ„์˜ ์‚ฌ์šฉ ๊ถŒํ•œ์ž…๋‹ˆ๋‹ค. single_file ์‚ฌ์šฉ ๊ถŒํ•œ์„ read ๋˜๋Š” write๋กœ ์„ค์ •ํ•˜๋ฉด ์ด ํ•„๋“œ๋Š” GitHub App์—์„œ ๊ด€๋ฆฌํ•  ๋‹จ์ผ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ํŒŒ์ผ์„ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์•„๋ž˜์˜ single_file_paths๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.
single_file_pathsarray of strings์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์•ฑ์ด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ์ตœ๋Œ€ 10๊ฐœ์˜ ์ง€์ •๋œ ํŒŒ์ผ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. single_file ์‚ฌ์šฉ ๊ถŒํ•œ์„ read ๋˜๋Š” write๋กœ ์„ค์ •ํ•˜๋ฉด ์ด ๋ฐฐ์—ด์€ GitHub App์—์„œ ๊ด€๋ฆฌํ•  ์ตœ๋Œ€ 10๊ฐœ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ์€ ๋ชจ๋‘ single_file์— ์˜ํ•ด ์„ค์ •๋œ ๋™์ผํ•œ ์‚ฌ์šฉ ๊ถŒํ•œ์„ ๋ฐ›์œผ๋ฉฐ ๋ณ„๋„์˜ ๊ฐœ๋ณ„ ์‚ฌ์šฉ ๊ถŒํ•œ์€ ์—†์Šต๋‹ˆ๋‹ค. ๋‘ ๊ฐœ ์ด์ƒ์˜ ํŒŒ์ผ์„ ๊ตฌ์„ฑํ•˜๋ฉด API๊ฐ€ multiple_single_files=true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด multiple_single_files=false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

GitHub App ์‚ฌ์šฉ ๊ถŒํ•œ

์ฟผ๋ฆฌ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ GitHub App ๋“ฑ๋ก์— ๋Œ€ํ•œ ๊ถŒํ•œ์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. URL ์ฟผ๋ฆฌ ๋งค๊ฐœ ๋ณ€์ˆ˜์˜ ๊ฒฝ์šฐ ์‚ฌ์šฉ ๊ถŒํ•œ ์ด๋ฆ„์„ ์ฟผ๋ฆฌ ๋งค๊ฐœ ๋ณ€์ˆ˜ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์ฟผ๋ฆฌ ๊ฐ’์„ ํ•ด๋‹น ๊ถŒํ•œ ์ง‘ํ•ฉ์— ๋Œ€ํ•ด ๊ฐ€๋Šฅํ•œ ๊ฐ’ ์ค‘ ํ•˜๋‚˜๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด contents์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค์—์„œ "์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ" ๊ถŒํ•œ์„ ์„ ํƒํ•˜๋ ค๋ฉด ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด์— contents=write๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด blocking์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค์—์„œ "์ฝ๊ธฐ ์ „์šฉ" ๊ถŒํ•œ์„ ์„ ํƒํ•˜๋ ค๋ฉด ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด์— blocking=read๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด checks์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค์—์„œ "์•ก์„ธ์Šค ๋ถˆ๊ฐ€" ๊ถŒํ•œ์„ ์„ ํƒํ•˜๋ ค๋ฉด ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด์— checks๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

์†Œ์œ  ๊ณ„์ •์ด ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ๋˜๋Š” ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์†Œ์œ  ์กฐ์ง์ด ์•„๋‹Œ ๊ฒฝ์šฐ, ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ๊ถŒํ•œ์„ ์š”์ฒญํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ถŒํ•œ ๋ฐ GitHub Apps์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ GitHub ์•ฑ์˜ ๊ถŒํ•œ ์„ ํƒ์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”. ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ถŒํ•œ ๋ชฉ๋ก๊ณผ ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ์ด๋ฆ„์„ ๋ณด๋ ค๋ฉด ๊ฐœ์ธ์šฉ ์•ก์„ธ์Šค ํ† ํฐ ๊ด€๋ฆฌ์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

GitHub App ์›นํ›„ํฌ ์ด๋ฒคํŠธ

์ฟผ๋ฆฌ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ GitHub App ์›นํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ•˜๊ณ , ์›นํ›„ํฌ URL์„ ์ง€์ •ํ•˜๊ณ , ํŠน์ • ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ์›นํ›„ํฌ ํŽ˜์ด๋กœ๋“œ๋ฅผ ์ˆ˜์‹ ํ•˜๋„๋ก ์•ฑ์„ ๊ตฌ๋…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

GitHub App ์›นํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ•˜๋ ค๋ฉด ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด์— webhook_active=true๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์›นํ›„ํฌ ์ด๋ฒคํŠธ ํŽ˜์ด๋กœ๋“œ๋ฅผ ๋ณด๋‚ด๋ ค๋Š” ์ „์ฒด URL์„ ์ง€์ •ํ•˜๋ ค๋ฉด ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด์— webhook_url์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ์›นํ›„ํฌ ํŽ˜์ด๋กœ๋“œ ์ด๋ฒคํŠธ์— ์•ฑ์„ ๊ตฌ๋…ํ•˜๋ ค๋ฉด ์ฟผ๋ฆฌ ๋งค๊ฐœ ๋ณ€์ˆ˜ ์ด๋ฆ„์œผ๋กœ events[]๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ฟผ๋ฆฌ ๊ฐ’์„ ์›นํ›„ํฌ ์ด๋ฒคํŠธ์˜ ์ด๋ฆ„์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ์›นํ›„ํฌ ์ด๋ฒคํŠธ์™€ ๊ฐ ์ด๋ฒคํŠธ๋ฅผ ๊ตฌ๋…ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ GitHub App ๊ถŒํ•œ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์›นํ›„ํฌ ์ด๋ฒคํŠธ ๋ฐ ํŽ˜์ด๋กœ๋“œ์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

์˜ˆ๋ฅผ ๋“ค์–ด GitHub App์„(๋ฅผ) ๊ตฌ๋…ํ•˜์—ฌ ์ปค๋ฐ‹ ๋ฉ”๋ชจ์™€ ๊ด€๋ จ๋œ ํ™œ๋™์— ๋Œ€ํ•œ ์›นํ›„ํฌ ํŽ˜์ด๋กœ๋“œ๋ฅผ ๋ฐ›์œผ๋ ค๋ฉด ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด์— &webhook_active=true&webhook_url=https://example.com&events[]=commit_comment๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. commit_comment ์›นํ›„ํฌ ์ด๋ฒคํŠธ์—๋Š” GitHub App์ด(๊ฐ€) "์ฝ˜ํ…์ธ " ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๊ถŒํ•œ์— ๋Œ€ํ•œ ์ฝ๊ธฐ ์ˆ˜์ค€ ์ด์ƒ์˜ ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด์—๋Š” contents ๊ถŒํ•œ์„ read ๋˜๋Š” write๋กœ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•œ ๋งค๊ฐœ ๋ณ€์ˆ˜๋„ ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ GitHub ์•ฑ ๊ถŒํ•œ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์ฟผ๋ฆฌ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›นํ›„ํฌ ์•”ํ˜ธ ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์•ฑ์—์„œ ์›นํ›„ํฌ๋ฅผ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด ๋น„๋ฐ€์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์•ฑ์„ ๋“ฑ๋กํ•˜๋Š” ์‚ฌ๋žŒ์ด GitHub UI์—์„œ ์•”ํ˜ธ ๊ฐ’์„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์›นํ›„ํฌ ๋ฐ GitHub Apps์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ GitHub ์•ฑ์— ์›นํ›„ํฌ ์‚ฌ์šฉ์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.