title | intro | redirect_from | versions | topics | ||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
GitHub Appãäœæããããã®éçºç°å¢ã®ã»ããã¢ãã |
æ°ãã{% data variables.product.prodname_github_apps %}ãæ¡åŒµããŠæ§ç¯ããããã®åºç€ãåŠãã§ãã ããã |
|
|
|
ãã®ã¬ã€ãã¯ãGitHub Appãèšå®ããŠãµãŒããŒäžã§å®è¡ããããã«å¿ èŠãªã¹ããããæ¡å ããŸãã GitHub Appã«ã¯ãwebhookã€ãã³ãã管çããGitHubäžã®ã¢ããªã±ãŒã·ã§ã³ã®ç»é²ãã³ãŒãã«æ¥ç¶ããããã®ã»ããã¢ããã®ã¹ããããå¿ èŠã§ãã ãã®ã¬ã€ãã®ã¢ããªã±ãŒã·ã§ã³ã¯ãæ¡åŒµããŠæ°ããGitHub Appãæ§ç¯ããããã®åºç€ã®åœ¹ç®ãæãããŸãã
ãã®ã¬ã€ããçµããã°ãGitHub Appãç»é²ããwebhookã€ãã³ããåä¿¡ããããã®WebãµãŒããŒãã»ããã¢ããã§ããŸãã SmeeãšããããŒã«ã䜿ã£ãŠwebhookãã€ããŒãããã£ããã£ããããŒã«ã«ã®éçºç°å¢ã«è»¢éããæ¹æ³ãåŠã³ãŸãã ãã®ã»ã¯ã·ã§ã³ã§èšå®ãããã³ãã¬ãŒãã®ã¢ããªã±ãŒã·ã§ã³ã¯ç¹å¥ãªããšã¯ããŸããããAPIã䜿ã£ãŠã¢ããªã±ãŒã·ã§ã³ã³ãŒããæžãã¯ãããããä»ã®ã¯ã€ãã¯ã¹ã¿ãŒãã¬ã€ããå®äºããããããããã«äœ¿çšã§ãããã¬ãŒã ã¯ãŒã¯ãšããŠåããŸãã {% if currentVersion == "free-pro-team@latest" %} ã¢ããªã±ãŒã·ã§ã³ã®æåäŸã¯ãGitHub MarketplaceãWorks with GitHubã§èª¿ã¹ãããšãã§ããŸãã{% endif %}
ãã®ãããžã§ã¯ããå®äºãããšãGitHub Appåã³ã€ã³ã¹ããŒã«ãšããŠèªèšŒãåããæ¹æ³ãšããããã®èªèšŒæ¹æ³ã®éããç解ã§ããŸãã
以äžã®ã¹ãããã§ããã³ãã¬ãŒãã®GitHub Appãèšå®ã§ããŸãã
- æ°ããSmeeãã£ã³ãã«ã®éå§
- æ°ããGitHub Appã®ç»é²
- ç§å¯éµãšApp IDã®ä¿å
- ã©ã³ã¿ã€ã ç°å¢ã®æºå
- GitHub Appã®ãã³ãã¬ãŒãã³ãŒãã®ã¬ãã¥ãŒ
- ãµãŒããŒã®èµ·å
- ã¢ã«ãŠã³ããžã®ã¢ããªã±ãŒã·ã§ã³ã®ã€ã³ã¹ããŒã«
{% data reusables.apps.app-ruby-guides %}
以äžã«é¢ããåºæ¬çãªç解ããããšåœ¹ç«ã€ã§ãããã
ãšã¯ãããçµéšã®ã¬ãã«ã«ãããããèŠãŠããããšã¯ã§ããŸãã ãã®éçšã§å¿ èŠãªæ å ±ã«ã¯ãªã³ã¯ããŠãããŸãïŒ
å§ããåã«ããã®ã¯ã€ãã¯ã¹ã¿ãŒãã§äœ¿ããããã³ãã¬ãŒãã³ãŒãã®ãªããžããªãã¯ããŒã³ããå¿ èŠããããŸãã ã¿ãŒããã«ã¢ããªã±ãŒã·ã§ã³ãéããŠãã³ãŒããä¿åããããã£ã¬ã¯ããªã«ç§»åããŠãã ããã 以äžã®ã³ãã³ããå®è¡ããŠãGitHub Appãã³ãã¬ãŒããªããžããªãã¯ããŒã³ããŠãã ããã
$ git clone https://github.com/github-developer/github-app-template.git
ããŒã«ã«ã®ãã·ã³ãã€ã³ã¿ãŒãããã«å ¬éããããšãªããGitHubãwebhookãéä¿¡ããã®ãæ¯æŽããããã«ãSmeeãšããããŒã«ãå©çšã§ããŸãã ãŸã https://smee.io ã«ã¢ã¯ã»ã¹ããŠãStart a new channelãã¯ãªãã¯ããŠãã ããã ngrokãlocaltunnelã®ãããªãããŒã«ã«ãã·ã³ãã€ã³ã¿ãŒãããã«å ¬éããŠãããä»ã®ããŒã«ã«æ £ããŠãããªãããããã䜿ã£ãŠãããŸããŸããã
æ°ããSmeeã®ãã£ã³ãã«ãèµ·åãããšãGitHubãwebhookãã€ããŒããéä¿¡ã§ãããŠããŒã¯ãªãã¡ã€ã³ãäœæãããŸãã 次ã®ã¹ãããã§å¿
èŠãªã®ã§ããã®ãã¡ã€ã³ãç¥ã£ãŠããå¿
èŠããããŸãã ãŠããŒã¯ãªãã¡ã€ã³ã®äŸã¯https://smee.io/qrfeVRbFbffd6vD
ãšãã£ããã®ã§ãã
次ã«ãã¿ãŒããã«ã«æ»ã£ãŠä»¥äžã®ã¹ãããã«åŸããSmeeã®ã³ãã³ãã©ã€ã³ã€ã³ã¿ãŒãã§ãŒã¹ïŒCLIïŒã¯ã©ã€ã¢ã³ããå®è¡ããŠãã ããã
{% note %}
ããŒã: 以äžã®ã¹ãããã¯ãSmeeãã£ã³ãã«ã®ããŒãžã«è¡šç€ºããã"Use the CLI"ã®æ瀺ãšã¯ããç°ãªã£ãŠããŸãã "Use the Node.js client"ãããã¯"Using Probot's built-in support"ã®æ瀺ã«åŸãå¿ èŠã¯ãããŸããã
{% endnote %}
-
ã¯ã©ã€ã¢ã³ããã€ã³ã¹ããŒã«ããŸãã
$ npm install --global smee-client
-
ã¯ã©ã€ã¢ã³ããå®è¡ããŸãïŒ
https://smee.io/qrfeVRbFbffd6vD
ãèªåã®ãã¡ã€ã³ã§çœ®ãæããŠãã ããïŒã$ smee --url https://smee.io/qrfeVRbFbffd6vD --path /event_handler --port 3000
以äžã®ããã«åºåãããã§ãããã
Forwarding https://smee.io/qrfeVRbFbffd6vD to http://127.0.0.1:3000/event_handler Connected https://smee.io/qrfeVRbFbffd6vD
smee --url <unique_channel>
ãšããã³ãã³ãã¯ãSmeeã«å¯ŸããŠSmeeã®ãã£ã³ãã«ãåä¿¡ãããã¹ãŠã®webhookã€ãã³ãããã³ã³ãã¥ãŒã¿ãŒäžã§åäœããSmeeã¯ã©ã€ã¢ã³ãã«è»¢éããããã«æ瀺ããŠããŸãã --path /event_handler
ãªãã·ã§ã³ã¯ãã€ãã³ãã/event_handler
ãšããã«ãŒãã«è»¢éããŸãããã®ã«ãŒãã«ã€ããŠã¯åŸã®ã»ã¯ã·ã§ã³ã§åãäžããŸãã --port 3000
ãªãã·ã§ã³ã¯ããŒã3000ãæå®ããŠããããµãŒããŒã¯ãã®ããŒãã§åŸ
ã¡åããŸãã Smeeã䜿ãã°ãGitHubããã®webhookãåä¿¡ããããã«ããªãã®ãã·ã³ããããªãã¯ãªã€ã³ã¿ãŒãããã«å¯ŸããŠãªãŒãã³ã§ããå¿
èŠã¯ãããŸããã ãŸãããã©ãŠã¶ã§Smeeã®URLãéããŠãåä¿¡ããwebhookã®ãã€ããŒãã調ã¹ãããšãã§ããŸãã
ãã®ã¿ãŒããã«ã®ãŠã£ã³ããŠã¯éãããŸãŸã«ããŠããããã®ã¬ã€ãã®æ®ãã®ã¹ããããå®äºããããŸã§ã®éãSmeeã«æ¥ç¶ãããŸãŸã«ããŠããããšãããããããŸãã ãŠããŒã¯ãªãã¡ã€ã³ã倱ãããšãªãSmeeã®ã¯ã©ã€ã¢ã³ãã®æ¥ç¶ãåã£ãŠãæ¥ç¶ããªããããšã_ã§ããŸã_ãïŒngrokãšã¯éã£ãŠïŒãããã¯æ¥ç¶ãããŸãŸã«ããŠãããŠãå¥ã®ã¿ãŒããã«ãŠã£ã³ããŠã§ä»ã®ã³ãã³ãã©ã€ã³ã®ã¿ã¹ã¯ãè¡ãããã«ããã»ããç°¡åã§ãããã
ãŸã GitHubã®ã¢ã«ãŠã³ããæã£ãŠããªããªãããããåå ããæã§ãã ç¶è¡ããåã«ã¡ãŒã«ã確èªããã®ãå¿ããªãããã«ããŠãã ãã! æ°ããã¢ããªã±ãŒã·ã§ã³ãç»é²ããã«ã¯ãèªåã®GitHubã®ãããã£ãŒã«å ã®ã¢ããªã±ãŒã·ã§ã³èšå®ããŒå§ã«ã¢ã¯ã»ã¹ããNew GitHub Appãã¯ãªãã¯ããŠãã ããã
衚瀺ããããã©ãŒã ã§ãã¢ããªã±ãŒã·ã§ã³ã®è©³çŽ°ãå ¥åã§ããŸãã ãã®ããŒãžã®ãã£ãŒã«ãã«é¢ããäžè¬çãªæ å ±ã«ã€ããŠã¯ãGitHub Appã®äœæããåç §ããŠãã ããã ãã®ã¬ã€ãã«ã€ããŠã¯ãããã€ãã®ãã£ãŒã«ãã«ç¹å®ã®ããŒã¿ãå ¥åããå¿ èŠããããŸãã
{% note %}
ããŒã: ãããã®èšå®ã¯ãã€ã§ãæŽæ°ããŠããã¹ãããããµãŒããŒãæãããã«ã§ããŸãã
{% endnote %}
-
"Homepage URLïŒããŒã ããŒãžã®URLïŒ"ã«ã¯ãSmeeãçºè¡ãããã¡ã€ã³ã䜿çšããŠãã ããã äŸ:
-
"Webhook URLïŒwebhookã®URLïŒ"ã«ã¯ããã¯ãSmeeãçºè¡ãããã¡ã€ã³ã䜿ã£ãŠãã ããã äŸ:
-
"Webhook secretïŒwebhookã®ã·ãŒã¯ã¬ããïŒ"ã«ã¯ãwebhookã®ãšã³ããã€ã³ããä¿è·ãããã¹ã¯ãŒããäœæããŠãã ããã ããã¯ãããªãïŒãããŠãã®ãã©ãŒã ãä»ããŠGitHubïŒã ããç¥ã£ãŠãããã®ã«ããã¹ãã§ãã ãããªãã¯ãªã€ã³ã¿ãŒãããããåä¿¡ãããã€ããŒãã§ãwebhookã®éä¿¡è ãæ€èšŒããã®ã«äœ¿ãããã®ã§ããã®ã·ãŒã¯ã¬ããã¯éèŠã§ãã GitHub Appã®èšå®ã§ã¯ãã®webhookã®ã·ãŒã¯ã¬ããã¯ãªãã·ã§ã³ãšãªã£ãŠãããããã¯ã»ãšãã©ã®å Žåæ£ããã§ããããã®ãã³ãã¬ãŒãã®ã¢ããªã±ãŒã·ã§ã³ã³ãŒããåäœãããããã«ã¯ãwebhookã®ã·ãŒã¯ã¬ããã¯èšå®ããªããã°ãªããŸããã
-
Permissions & WebhooksïŒæš©éãšwebhookïŒããŒãžã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã®æš©éã»ãããæå®ã§ããŸããããã«ãã£ãŠãã¢ããªã±ãŒã·ã§ã³ãã©ãã ãã®ããŒã¿ã«ã¢ã¯ã»ã¹ã§ãããã決ãŸããŸãã Under the "Repository permissions" section, scroll down to "Metadata" and select
Access: Read-only
. ãã®ãã³ãã¬ãŒãã¢ããªã±ãŒã·ã§ã³ãæ¡åŒµããããšã«ããããåŸã§ãããã®æš©éãæŽæ°ã§ããŸãã -
Permissions & WebhooksïŒæš©éãšwebhookïŒããŒãžã®äžéšã§ãããããã©ã€ããŒãã®ã¢ããªã±ãŒã·ã§ã³ãªã®ãããããªãã¯ã®ã¢ããªã±ãŒã·ã§ã³ãªã®ããæå®ããŠãã ããã ããã¯ãã¢ããªã±ãŒã·ã§ã³ã誰ãã€ã³ã¹ããŒã«ã§ããã®ããããªãã¡ããªãã ããªã®ãã誰ã§ãã§ããã®ããæããŸãã ãã®æç¹ã§ã¯ã**Only on this accountïŒãã®ã¢ã«ãŠã³ãã®ã¿ïŒ**ãéžæããŠãã¢ããªã±ãŒã·ã§ã³ããã©ã€ããŒãã®ãŸãŸã«ããŠãããŠãã ããã
**Create GitHub AppïŒGitHub Appã®äœæïŒ**ãã¯ãªãã¯ããŠãã¢ããªã±ãŒã·ã§ã³ãäœæããŠãã ãã!
ã¢ããªã±ãŒã·ã§ã³ãäœæãããšãã¢ããªã±ãŒã·ã§ã³ã®èšå®ããŒãžã«æ»ãããŸãã ããã§è¡ãããšãããš2ã€ãããŸãã
-
**ã¢ããªã±ãŒã·ã§ã³ã®ç§å¯éµã®çæã**ããã¯åŸã§ã¢ããªã±ãŒã·ã§ã³ãèªèšŒããããã«å¿ èŠã§ãã ããŒãžãã¹ã¯ããŒã«ããŠã³ããŠã**Generate a private keyïŒç§å¯éµã®çæïŒ**ãã¯ãªãã¯ããŠãã ããã çæãããPEMãã¡ã€ã«ïŒ
app-name
-date
-private-key.pemãšãããããªååïŒãããŸãèŠã€ãããããã£ã¬ã¯ããªã«ä¿åããŠãã ããã -
**GitHubãã¢ããªã±ãŒã·ã§ã³ã«å²ãåœãŠãApp IDãèšé²ããŠãã ããã**ããã¯ãã©ã³ã¿ã€ã ç°å¢ãæºåããã®ã«å¿ èŠã«ãªããŸãã
æ
å ±ãä¿è·ããããã«ãã¢ããªã±ãŒã·ã§ã³ã«é¢ãããã¹ãŠã®ã·ãŒã¯ã¬ããã¯ãçŽæ¥ã³ãŒãã«åã蟌ãã®ã§ã¯ãªããã¢ããªã±ãŒã·ã§ã³ãèŠã€ããããšãã§ããã³ã³ãã¥ãŒã¿ã®ã¡ã¢ãªäžã«çœ®ããŠããããšãããããããŸãã dotenvãšãã䟿å©ãªéçºããŒã«ã¯ããããžã§ã¯ãã«åºæã®å€æ°ã.env
ãã¡ã€ã«ããENV
ã«ããŒãããŠãããŸãã .env
ãã¡ã€ã«ã¯ã決ããŠGitHubã«ãã§ãã¯ã€ã³ããªãã§ãã ããã ããã¯ããããªãã¯ãªã€ã³ã¿ãŒãããäžã«ããããããªãæ©å¯æ
å ±ãä¿åããããŒã«ã«ãã¡ã€ã«ã§ãã The .env
file is already included in the repository's .gitignore
file to prevent that.
å¿
èŠãªç°å¢ã®ã»ã¯ã·ã§ã³ã§ããŠã³ããŒããããã³ãã¬ãŒãã³ãŒãã«ã¯ã.env-example
ãšãããµã³ãã«ã®ãã¡ã€ã«ãçšæãããŠããŸãã ãã®ãµã³ãã«ã®ãã¡ã€ã«ã®ååã.env-example
ãã.env
ã«å€æŽãããã.env
ãšãããã¡ã€ã«ã.env-example
ãã³ããŒããŠäœæããŠãã ããã ãŸã dotenvã¯ã€ã³ã¹ããŒã«ããŠããŸãããããã®ã¯ã€ãã¯ã¹ã¿ãŒãã§åŸã«bundle install
ãå®è¡ããéã«ã€ã³ã¹ããŒã«ããŸãã **ããŒã:**ãã®ã¬ã€ãã®ã¹ããããåç
§ããã¯ã€ãã¯ã¹ã¿ãŒãã¯ã.env-example
ã«è¿œå ã®ç°å¢å€æ°ãå«ãã§ããããšããããŸãã ãããã®è¿œå ã®ç°å¢å€æ°ãèšå®ããããã®ã¬ã€ãã³ã¹ã«ã€ããŠã¯ãGitHubäžã§ã¯ããŒã³ãããããžã§ã¯ãã®ã¯ã€ãã¯ã¹ã¿ãŒãã¬ã€ããåç
§ããŠãã ããã
以äžã®å€æ°ã.env
ãã¡ã€ã«ã«è¿œå ããªããã°ãªããŸããã
GITHUB_PRIVATE_KEY
: 以åã«çæããŠä¿åããç§å¯éµãè¿œå ããŠãã ããã ããã¹ããšãã£ã¿ã§.pem
ãã¡ã€ã«ãéãããã³ãã³ãã©ã€ã³ããcat path/to/your/private-key.pem
ãšããŠãã¡ã€ã«ã®å 容ã衚瀺ããŠãã ããã ãã¡ã€ã«ã®å å®¹å šäœã.env
ãã¡ã€ã«äžã®GITHUB_PRIVATE_KEY
ã®å€ãšããŠã³ããŒããŠãã ããã ããŒã: PEMãã¡ã€ã«ã«ã¯è€æ°è¡ãããã®ã§ã以äžã®äŸã®ããã«åŒçšç¬Šãå€ã®åšãã«è¿œå ããªããã°ãªããŸãããGITHUB_APP_IDENTIFIER
: åã»ã¯ã·ã§ã³ã§èšé²ããApp IDã䜿ã£ãŠãã ãããGITHUB_WEBHOOK_SECRET
: webhookã®ã·ãŒã¯ã¬ãããè¿œå ããŠãã ããã
以äžã¯.env
ãã¡ã€ã«ã®äŸã§ãã
GITHUB_PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----
...
HkVN9...
...
-----END DSA PRIVATE KEY-----"
GITHUB_APP_IDENTIFIER=12345
GITHUB_WEBHOOK_SECRET=your webhook secret
ãã³ãã¬ãŒãã®ã¢ããªã±ãŒã·ã§ã³ã³ãŒãã«ã¯ããã¹ãŠã®GitHub Appãå¿ èŠãšããå€å°ã®ã³ãŒãããã§ã«å«ãŸããŠããŸãã ãã®ã»ã¯ã·ã§ã³ã§ã¯ãGitHub Appã®ãã³ãã¬ãŒãã«ãã§ã«ããã³ãŒããèŠãŠãããŸãã ãã®ã»ã¯ã·ã§ã³ã§å®äºããªããã°ãªããªãã¹ãããã¯ãããŸããã ãã³ãã¬ãŒãã³ãŒãã«ãã§ã«éŠŽæãã§ãããªãããã¹ããã 6 ãµãŒããŒã®èµ·åããŸã§ã¹ãããã§ããŸãã
奜ããªããã¹ããšãã£ã¿ã§template_server.rb
ãã¡ã€ã«ãéããŠãã ããã ãã®ãã¡ã€ã«ã«ã¯ãå
šäœãéããŠãã³ãã¬ãŒãã³ãŒãã®è¿œå ã®ã³ã³ããã¹ããæäŸããã³ã¡ã³ãããããŸãã ãããã®ã³ã¡ã³ãã泚ææ·±ãèªãã§ãããã«ã¯äœæããæ°ããã³ãŒãã«æ·»ããŠç¬èªã®ã³ã¡ã³ããè¿œå ããããšãããããããŸãã
ãã¡ã€ã«ã®å
é ã«ã¯set :port 3000
ããããŸããããã¯ãWebãµãŒããŒãèµ·åãããšãã«äœ¿ãããããŒããèšå®ããŠããã¹ããã1 æ°ããSmeeãã£ã³ãã«ã®éå§"ã§webhookã®ãã€ããŒãããªãã€ã¬ã¯ãããããŒããšäžèŽãããŸãã
次ã«åºãŠããã³ãŒãã¯class GHApp < Sintra::Application
ãšãã宣èšã§ãã GitHub Appã®ãã¹ãŠã®ã³ãŒãã¯ããã®ã¯ã©ã¹ã®äžã«æžããŠãããŸãã
ãã®ãŸãŸã®ç¶æ ã§ã¯ããã³ãã¬ãŒãäžã®ãã®ã¯ã©ã¹ã¯ä»¥äžã®ããšãè¡ããŸãã
- ç°å¢å€æ°ã®èªã¿åã
- ãã®ã³ã°ã®æå¹å
- ããã©ã¢ãã£ã«ã¿ã®å®çŸ©
- ã«ãŒããã³ãã©ã®å®çŸ©
- ãã«ããŒã¡ãœããã®å®çŸ©
ãã®ã¯ã©ã¹ãæåã«è¡ãã®ã¯ããã¹ããã4 ã©ã³ã¿ã€ã ç°å¢ã®æºåãã§èšå®ãã3ã€ã®ç°å¢å€æ°ãèªã¿åããåŸã§äœ¿ãããã«å€æ°ã«èšå®ããããšã§ãã
#ç§å¯éµã¯PEMãã©ãŒãããã§ããããšãæåŸ
ããã æ¹è¡ãå€æããã
PRIVATE_KEY = OpenSSL::PKey::RSA.new(ENV['GITHUB_PRIVATE_KEY'].gsub('\n', "\n"))
# ç»é²ãããã¢ããªã±ãŒã·ã§ã³ã«ã¯ã·ãŒã¯ã¬ãããèšå®ãããŠããªããã°ãªããªãã ãã®ã·ãŒã¯ã¬ããã¯æ€èšŒã«äœ¿ããã
# that webhooks are sent by GitHub.
WEBHOOK_SECRET = ENV['GITHUB_WEBHOOK_SECRET']
# ã¢ããªã±ãŒã·ã§ã³ã®ç»é²æã«èšå®ãããGitHub Appã®èå¥å(åã¯integer)ã
APP_IDENTIFIER = ENV['GITHUB_APP_IDENTIFIER']
次ã¯ãSinatraã«ãããããã©ã«ãã®ç°å¢ã§ããéçºã®éããã®ã³ã°ãæå¹ã«ããã³ãŒããããã¯ã§ãã ãã®ã³ãŒãã¯DEBUG
ã¬ãã«ã§ãã®ã³ã°ãæå¹åããã¢ããªã±ãŒã·ã§ã³ã®éçºã®éãã¿ãŒããã«ã«æçãªåºåãè¡ããŸãã
# Sinatraã®è©³çŽ°ãªãã®ã³ã°ãéçºã®éæå¹ã«ãã
configure :development do
set :logging, Logger::DEBUG
end
Sinatraã¯ãã«ãŒããã³ãã©ãããå
ã«ã³ãŒããå®è¡ã§ããããã«ããŠãããããã©ã¢ãã£ã«ã¿ã䜿ããŸãã ãã³ãã¬ãŒãäžã®before
ãããã¯ã¯ã4ã€ã®ãã«ããŒã¡ãœãããåŒã³ãŸãã ãã®ãã³ãã¬ãŒãã¢ããªã±ãŒã·ã§ã³ã§ã¯ããããã®ãã«ããŒã¡ãœããã¯åŸã®ã»ã¯ã·ã§ã³ã§å®çŸ©ããŸãã
# `/event_handler`ã«ãŒããžã®åãªã¯ãšã¹ãã®å
before '/event_handler' do
get_payload_request(request)
verify_webhook_signature
authenticate_app
# APIæäœãå®è¡ããããã«ãã¢ããªã±ãŒã·ã§ã³ã®ã€ã³ã¹ããŒã«ãèªèšŒ
authenticate_installation(@payload)
end
ãã³ãã¬ãŒãã³ãŒãã«ã¯ã空ã®ã«ãŒããå«ãŸããŠããŸãã ãã®ã³ãŒãã¯ã/event_handler
ã«ãŒããžã®ãã¹ãŠã®POST
ãªã¯ãšã¹ããåŠçããŸãã ãã®ã¯ã€ãã¯ã¹ã¿ãŒãã§ã¯ãã®ã€ãã³ããã³ãã©ã¯æžããŸãããããã®ãã³ãã¬ãŒãã¢ããªã±ãŒã·ã§ã³ã®æ¡åŒµæ¹æ³ã®äŸã«ã€ããŠã¯ä»ã®ã¯ã€ãã¯ã¹ã¿ãŒãã¬ã€ããåç
§ããŠãã ããã
post '/event_handler' do
end
ãã®ãã³ãã¬ãŒãã®ãã«ããŒã¡ãœããã¯ãæãé£ããåŠçã®ã»ãšãã©ãè¡ããŸãã ã³ãŒãã®ãã®ã»ã¯ã·ã§ã³ã§ã¯ã4ã€ã®ãã«ããŒã¡ãœãããå®çŸ©ãããŠããŸãã
æåã®ã¡ãœããã§ããget_payload_request
ã¯ãwebhookã®ãã€ããŒãããã£ããã£ããŠJSON圢åŒã«å€æãããã€ããŒãã®ããŒã¿ã«ã¢ã¯ã»ã¹ããããããŸãã
2çªç®ã®ã¡ãœããã®verify_webhook_signature
ã¯ãwebhookã®çœ²åãæ€èšŒããŠããã®ã€ãã³ããGitHubãçæãããã®ã§ããããšã確èªããŸãã verify_webhook_signature
ãã«ããŒã¡ãœããäžã®ã³ãŒãã«ã€ããŠããã«åŠã¶ã«ã¯ããwebhookãã»ãã¥ã¢ã«ããããåç
§ããŠãã ããã webhookãã»ãã¥ã¢ã§ããã°ããã®ã¡ãœããã¯åãåã£ããã€ããŒãã®ãã¹ãŠãã¿ãŒããã«ã«åºåããŸãã ãã¬ãŒã®ã³ãŒãã¯WebãµãŒããŒãåäœããŠããããšã確èªããã®ã«åœ¹ç«ã¡ãŸãããåŸã§ãã€ã§ãåãé€ãããšãã§ããŸãã
APIåŒã³åºããè¡ãã«ã¯ãOctokitã©ã€ãã©ãªã䜿ããŸãã ãã®ã©ã€ãã©ãªã§äœãé¢çœãããšãè¡ãã«ã¯ãããªãããããã¯ãããã¢ããªã±ãŒã·ã§ã³ãèªèšŒãåããå¿ èŠããããŸãã GitHub Appã«ã¯2ã€ã®èªèšŒæ¹æ³ããããŸãã
- JSON WebããŒã¯ã³ (JWT)ã䜿ã£ãŠGitHub AppãšããŠèªèšŒãåããã
- ã€ã³ã¹ããŒã«ã¢ã¯ã»ã¹ããŒã¯ã³ã䜿ã£ãŠç¹å®ã®GitHub Appã®ã€ã³ã¹ããŒã«ãšããŠèªèšŒãåããã
ã€ã³ã¹ããŒã«ãšããŠã®èªèšŒã«ã€ããŠã¯æ¬¡ã®ã»ã¯ã·ã§ã³ã§åŠã³ãŸãã
GitHub AppãšããŠèªèšŒãåãããšãããã€ãã®ããšãã§ããããã«ãªããŸãã
- GitHub Appã«é¢ããé«ã¬ãã«ã®ç®¡çæ å ±ãååŸã§ããŸãã
- ã¢ããªã±ãŒã·ã§ã³ã®ã€ã³ã¹ããŒã«ã®ãããã¢ã¯ã»ã¹ããŒã¯ã³ããªã¯ãšã¹ãã§ããŸãã
ããšãã°ãGitHub AppãšããŠèªèšŒãåããŠããã®ã¢ããªã±ãŒã·ã§ã³ãã€ã³ã¹ããŒã«ããã¢ã«ãŠã³ãïŒOrganizationåã³å人ïŒã®ãªã¹ããååŸã§ããŸãã ãããããã®èªèšŒæ¹æ³ã§ã¯APIã䜿ã£ãŠå€ãã®ããšã¯è¡ããŸããã ã€ã³ã¹ããŒã«ã®ä»£ããã«ãªããžããªã®ããŒã¿ã«ã¢ã¯ã»ã¹ããŠæäœãè¡ãã«ã¯ãã€ã³ã¹ããŒã«ãšããŠèªèšŒãåããªããã°ãªããŸããã ãã®ããã«ã¯ããŸãGitHub AppãšããŠèªèšŒãåããŠãã€ã³ã¹ããŒã«ã¢ã¯ã»ã¹ããŒã¯ã³ããªã¯ãšã¹ãããªããã°ãªããŸããã
APIåŒã³åºããçºè¡ããããã«Octokit.rbã©ã€ãã©ãªã䜿ããããã«ãªãåã«ãGitHub AppãšããŠèªèšŒãããOctokit clientãåæåããªããã°ãªããŸããã authenticate_app
ãã«ããŒã¡ãœããããŸãã«ãããè¡ã£ãŠãããŸã!
# GitHub AppãšããŠèªèšŒãããOctokitã¯ã©ã€ã¢ã³ããåæåããã
# GitHub Appã®èªèšŒã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ç§å¯éµã§çœ²åããã
# JWT (https://jwt.io/introduction/)ãæ§ç¯ããŠããããã¢ããªã±ãŒã·ã§ã³
# ããæ¥ãŠãããæªæãããµãŒãããŒãã£ã«ãã£ãŠæ¹å€ãããŠããªã
# ããšãGitHubã確èªã§ããããã«ããå¿
èŠãããã
def authenticate_app
payload = {
# ãã®JWTãçºè¡ãããæå»ãããšãã°ä»ã
iat: Time.now.to_i,
# JWTã®æå¹æé(æ倧10å)
exp: Time.now.to_i + (10 * 60),
# GitHub Appã®èå¥çªå·
iss: APP_IDENTIFIER
}
# æå·çã« JWTã«çœ²å
jwt = JWT.encode(payload, PRIVATE_KEY, 'RS256')
# JWTãèªèšŒããŒã¯ã³ãšããŠäœ¿ã£ãŠOctokitã¯ã©ã€ã¢ã³ããäœæã
@app_client ||= Octokit::Client.new(bearer_token: jwt)
end
ãã®ã³ãŒãã¯JSON WebããŒã¯ã³ïŒJWTïŒãçæãããããïŒã¢ããªã±ãŒã·ã§ã³ã®ç§å¯éµãšãšãã«ïŒäœ¿ã£ãŠOctokitã¯ã©ã€ã¢ã³ããåæåããŸãã GitHubã¯ãä¿åãããã¢ããªã±ãŒã·ã§ã³ã®å ¬ééµã§ããŒã¯ã³ãæ€èšŒããããšã«ãã£ãŠããªã¯ãšã¹ãã®èªèšŒã確èªããŸãã ãã®ã³ãŒãã®åäœã«ã€ããŠããã«åŠã¶ã«ã¯ããGitHub AppãšããŠèªèšŒããããåç §ããŠãã ããã
_ã€ã³ã¹ããŒã«_ãšã¯ãã¢ããªã±ãŒã·ã§ã³ãã€ã³ã¹ããŒã«ãããŠãŒã¶ãŸã㯠Organization ã®ã¢ã«ãŠã³ããæããŸãã ãã人ãã¢ããªã±ãŒã·ã§ã³ãè€æ°ã®ãªããžããªã«ã€ã³ã¹ããŒã«ããå Žåã§ãããããã¯åãã¢ã«ãŠã³ãå
ãªã®ã§1ã€ã®ã€ã³ã¹ããŒã«ãšããã«ãŠã³ããããŸããã æåŸã®ãã«ããŒã¡ãœããã§ããauthenticate_installation
ã¯ãã€ã³ã¹ããŒã«ãšããŠèªèšŒãããOctokitã¯ã©ã€ã¢ã³ããåæåããŸãã ãã®Octokitã¯ã©ã€ã¢ã³ãã¯ãèªèšŒãããAPIåŒã³åºããè¡ãããã«äœ¿ãããŸãã
# GitHub Appã®ã€ã³ã¹ããŒã«ãšããŠèªèšŒãããOctokitã¯ã©ã€ã¢ã³ããã
# APIæäœãå®è¡ããããã«åæåããã
def authenticate_installation(payload)
installation_id = payload['installation']['id']
installation_token = @app_client.create_app_installation_access_token(installation_id)[:token]
@installation_client = Octokit::Client.new(bearer_token: installation_token)
end
Octokitã®create_app_installation_access_token
ã¡ãœããã¯ãã€ã³ã¹ããŒã«ããŒã¯ã³ãäœæããŸãã ãã®ã¡ãœããã¯ã2ã€ã®åŒæ°ãåããŸãã
- Installation (integer): GitHub Appã®ã€ã³ã¹ããŒã«ã®ID
- Options (hashãããã©ã«ãã¯
{}
): ã«ã¹ã¿ãã€ãºå¯èœãªãªãã·ã§ã³ã®ã»ãã
ãã€ã§ãGitHub Appãwebhookãåãåããšããã®äžã«ã¯id
ä»ãã®installation
ãªããžã§ã¯ããå«ãŸããŠããŸãã GitHub AppãšããŠèªèšŒãããã¯ã©ã€ã¢ã³ãã䜿ãããã®IDãcreate_app_installation_access_token
ã¡ãœããã«æž¡ããŠã€ã³ã¹ããŒã«ããšã®ã¢ã¯ã»ã¹ããŒã¯ã³ãçæããŸãã ã¡ãœããã«ã¯ãªãã·ã§ã³ãæž¡ããŠããªãã®ã§ããªãã·ã§ã³ã¯ããã©ã«ãã®ç©ºã®ããã·ã¥ã«ãªããŸãã ããã¥ã¡ã³ããèŠè¿ããŠã¿ãã°ãcreate_app_installation_access_token
ã®ã¬ã¹ãã³ã¹ã«ã¯token
ãšexpired_at
ãšãã2ã€ã®ãã£ãŒã«ããå«ãŸããŠããããšãåãããŸãã ãã³ãã¬ãŒãã®ã³ãŒãã¯ã¬ã¹ãã³ã¹äžã®ããŒã¯ã³ãéžæããã€ã³ã¹ããŒã«ã¯ã©ã€ã¢ã³ããåæåããŸãã
ãã®ã¡ãœãããå©çšããŠãã¢ããªã±ãŒã·ã§ã³ã¯æ°ããwebhookã®ãã€ããŒããåä¿¡ãããã³ã«ããã®ã€ãã³ããããªã¬ãŒããã€ã³ã¹ããŒã«ã®ããã®ã¯ã©ã€ã¢ã³ããäœæããŸãã ãã®èªèšŒããã»ã¹ã«ãã£ãŠãGitHub Appã¯ä»»æã®ã¢ã«ãŠã³ãã®ãã¹ãŠã®ã€ã³ã¹ããŒã«ã§åäœã§ããŸãã
ããã§APIåŒã³åºããçºè¡ããæºåãã§ããŸãã!
ãã®ã¢ããªã±ãŒã·ã§ã³ã¯ãŸã ãªã«ã_è¡ã_ãŸãããããã®æç¹ã§ãµãŒããŒäžã§åäœãããããšãã§ããŸãã
Smeeã¯ãã¿ãŒããã«ã®çŸåšã®ã¿ãã§åäœããç¶ããŠãããŠãã ããã æ°ããã¿ããéãããã³ãã¬ãŒãã¢ããªã±ãŒã·ã§ã³ã®ã³ãŒããã¯ããŒã³ãããã£ã¬ã¯ããªã«cd
ããŠãã ããã ãã®ãªããžããªã®Rubyã®ã³ãŒãã¯ãSinatra WebãµãŒããŒãèµ·åããŸãã ãã®ã³ãŒãã«ã¯ããã€ãã®äŸåé¢ä¿ããããŸãã ãããã¯ä»¥äžã®ããã«ããŠã€ã³ã¹ããŒã«ã§ããŸãã
$ gem install bundler
ç¶ããŠ
$ bundle install
äŸåé¢ä¿ãã€ã³ã¹ããŒã«ãããããµãŒããŒãèµ·åã§ããŸãã
$ ruby template_server.rb
次ã®ãããªã¬ã¹ãã³ã¹ãè¿ãããã¯ãã§ãã
> == Sinatra (v2.0.3) has taken the stage on 3000 for development with backup from Puma
> Puma starting in single mode...
> * Version 3.11.2 (ruby 2.4.0-p0), codename: Love Song
> * Min threads: 0, max threads: 16
> * Environment: development
> * Listening on tcp://localhost:3000
> Use Ctrl-C to stop
ãšã©ãŒãåºãå Žåã¯ãtemplate_server.rb
ããããã£ã¬ã¯ããªã«.env
ãã¡ã€ã«ãäœæãããã確ãããŠãã ããã
ãµãŒããŒãåäœãããããã©ãŠã¶ã§http://localhost:3000
ã«ã¢ã¯ã»ã¹ããŠãã¹ãããŠãã ããã ã¢ããªã±ãŒã·ã§ã³ãæåŸ
ã©ããã«åäœããŠããã°ã圹ã«ç«ã€ãšã©ãŒããŒãžã衚瀺ãããŸãã
ããŸããã£ãŠããŸã! ããã¯ãšã©ãŒããŒãžã§ã¯ãããŸããã_Sinatra_ã®ãšã©ãŒããŒãžã§ãããæåŸ ã©ããã«ã¢ããªã±ãŒã·ã§ã³ããµãŒããŒã«æ¥ç¶ãããŠãããšããããšã§ãã ãã®ã¡ãã»ãŒãžã衚瀺ãããŠããã®ã¯ãä»ã«è¡šç€ºãããã®ãäœãã¢ããªã±ãŒã·ã§ã³ã«å ããŠããªãããã§ãã
ãµãŒããŒãã¢ããªã±ãŒã·ã§ã³ãåŸ
ã¡åããŠãããã¯ãåä¿¡ããã€ãã³ããããªã¬ãŒããã°ãã¹ãã§ããŸãã ãã¹ãã§ããã·ã³ãã«ãªã€ãã³ãã¯ãèªåã®GitHubã¢ã«ãŠã³ãã«ã¢ããªã±ãŒã·ã§ã³ãã€ã³ã¹ããŒã«ããŠã¿ãããšã§ãããããã°installation
ã€ãã³ããéä¿¡ãããŸãã ã¢ããªã±ãŒã·ã§ã³ããããåä¿¡ããã°ãtemplate_server.rb
ãèµ·åããã¿ãŒããã«ã®ã¿ãã«ãäœãåºåãããã§ãããã
ã¢ããªã±ãŒã·ã§ã³ãã€ã³ã¹ããŒã«ããã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã®èšå®ããŒãžã«ã¢ã¯ã»ã¹ããã¢ããªã±ãŒã·ã§ã³ãéžæãããµã€ãããŒã®**Install AppïŒã¢ããªã±ãŒã·ã§ã³ã®ã€ã³ã¹ããŒã«ïŒãã¯ãªãã¯ããŠãã ããã ãŠãŒã¶åã®é£ã® InstallïŒã€ã³ã¹ããŒã«ïŒ**ãã¯ãªãã¯ããŠãã ããã
ã¢ããªã±ãŒã·ã§ã³ããã¹ãŠã®ãªããžããªã«ã€ã³ã¹ããŒã«ããããéžæãããªããžããªã«ã€ã³ã¹ããŒã«ããããå°ããããŸãã ã¢ããªã±ãŒã·ã§ã³ãèªåã®_ãã¹ãŠã®_ãªããžããªã«ã€ã³ã¹ããŒã«ããããªããããã§åé¡ãããŸãã! ãã¹ãçšã«ãµã³ãããã¯ã¹ãªããžããªãäœæããããã«ã¢ããªã±ãŒã·ã§ã³ãã€ã³ã¹ããŒã«ããŠãè¯ãã§ãããã
**InstallïŒã€ã³ã¹ããŒã«ïŒ**ãã¯ãªãã¯ããŠãã¿ãŒããã«ã®åºåãèŠãŠã¿ãŠãã ããã 以äžã®ããã«åºåãããŠããã§ãããã
> D, [2018-06-29T15:45:43.773077 #30488] DEBUG -- : ---- received event integration_installation
> D, [2018-06-29T15:45:43.773141 #30488] DEBUG -- : ---- action created
> 192.30.252.44 - - [29/Jun/2018:15:45:43 -0400] "POST / HTTP/1.1" 200 2 0.0067
> D, [2018-06-29T15:45:43.833016 #30488] DEBUG -- : ---- received event installation
> D, [2018-06-29T15:45:43.833062 #30488] DEBUG -- : ---- action created
> 192.30.252.39 - - [29/Jun/2018:15:45:43 -0400] "POST / HTTP/1.1" 200 2 0.0019
ããŸããã£ãŠããŸã! ããã¯ãGitHubã¢ã«ãŠã³ãã«ã¢ããªã±ãŒã·ã§ã³ãã€ã³ã¹ããŒã«ããããšããéç¥ãã¢ããªã±ãŒã·ã§ã³ãåä¿¡ãããšããããšã§ãã ãã®ãããªåºåãããã°ãã¢ããªã±ãŒã·ã§ã³ã¯ãµãŒããŒäžã§æåŸ ã©ããã«åäœããŠããŸãã ð
ãã®åºåããªããã°ãå¥ã®ã¿ãŒããã«ã¿ãã§Smeeãæ£ããåäœããŠããããšã確èªããŠãã ããã Smeeãåèµ·åããªããã°ãªããªãå Žåã¯ãã¢ããªã±ãŒã·ã§ã³ã«installation
ãå床éä¿¡ããŠã¿ãŒããã«ã®åºåãèŠãããã«ãã¢ããªã±ãŒã·ã§ã³ã_ã¢ã³ã€ã³ã¹ããŒã«_ããŠãã_ã€ã³ã¹ããŒã«ããªãããªããã°_ãªããªãããšã«æ³šæããŠãã ããã Smeeãåé¡ã§ã¯ãªãå Žåã¯ãä»ã®åå ããã©ãã«ã·ã¥ãŒãã£ã³ã°ã»ã¯ã·ã§ã³ã§åç
§ããŠãã ããã
äžèšã®ã¿ãŒããã«ã®åºåãã©ãããæ¥ãã®ãçåã«æããªããããã¯template_server.rb
äžã®ã¢ããªã±ãŒã·ã§ã³ã®ãã³ãã¬ãŒãã³ãŒãã«æžãããŠããŸãã
以äžã¯ãããã€ãã®äžè¬çãªåé¡ãšæšå¥šããã解決çã§ãã ä»ã®åé¡ãçããå Žåã¯ã{% data variables.product.prodname_support_forum_with_url %}ã§å©ããã¢ããã€ã¹ãæ±ããããšãã§ããŸãã
-
Q: Smeeã®ã³ãã³ãã©ã€ã³ã¯ã©ã€ã¢ã³ããã€ã³ã¹ããŒã«ããããšãããšã以äžã®ãšã©ãŒãè¿ãããŸãã
> npm: command not found
A: npmãã€ã³ã¹ããŒã«ãããŠããªãããã§ãã npmãã€ã³ã¹ããŒã«ããæãããæ¹æ³ã¯ãhttps://nodejs.orgããNode.jsããã±ãŒãžãããŠã³ããŒããã䜿ã£ãŠããã·ã¹ãã ã®ããã®ã€ã³ã¹ããŒã«ã®æ瀺ã«åŸãããšã§ãã npmã¯Node.jsãšäœµããŠã€ã³ã¹ããŒã«ãããŸãã
-
Q: ãµãŒããŒãå®è¡ãããšã以äžã®ãšã©ãŒãè¿ãããŸãã
> server.rb:38:in `initialize': Neither PUB key nor PRIV key: header too long (OpenSSL::PKey::RSAError)
A: ããããç§å¯éµã®ç°å¢å€æ°ãæ£ããèšå®ã»ããã¢ãããããŠããŸããã
GITHUB_PRIVATE_KEY
å€æ°ã¯ã以äžã®ããã«ãªã£ãŠããªããã°ãªããŸãããGITHUB_PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY----- ... HkVN9... ... -----END RSA PRIVATE KEY-----"
.env
ãã¡ã€ã«ã«æ£ããå ¬ééµãã³ããŒãããŠããããå確èªããŠãã ããã -
Q: ãµãŒããŒãåäœããããšã以äžã®ãšã©ãŒã§ã¯ã©ãã·ã¥ããŸãã
> Octokit::Unauthorized ... 401 - Bad credentials`
A: ã€ã³ã¹ããŒã«ãšããŠã§ã¯ãªããGitHub AppãšããŠèªèšŒãããŠããå¯èœæ§ããããŸãã ã€ã³ã¹ããŒã«ãšããŠèªèšŒä»¥äžã®ãã¹ãŠã®ã¹ãããã«åŸã£ãããšã確èªããAPIæäœã§ã¯ã€ã³ã¹ã¿ã³ã¹å€æ°ã®
@app_client
ïŒJWTã§ã®èªèšŒïŒã§ã¯ãªãã@installation_client
ã䜿ã£ãŠïŒã€ã³ã¹ããŒã«ã¢ã¯ã»ã¹ããŒã¯ã³ã§èªèšŒãåããïŒãã ããã@app_client
ã¯ã¢ããªã±ãŒã·ã§ã³ã«é¢ããé«ã¬ãã«ã®æ å ±ã ããååŸã§ããã€ã³ã¹ããŒã«ã¢ã¯ã»ã¹ããŒã¯ã³ãååŸã§ããŸãã ãã以å€ã®ããšãAPIã§è¡ãããšã¯ããŸãã§ããŸããã -
Q: ãµãŒããŒãã€ãã³ããåŸ ã¡åããŠããŸãã! Smeeã¯ã©ã€ã¢ã³ãã¯ã¿ãŒããã«ãŠã£ã³ããŠã§åäœããŠããŠãã¢ããªã±ãŒã·ã§ã³ãGitHubã®ãªããžããªã«ã€ã³ã¹ããŒã«ããŠããŸããããµãŒããŒãåäœãããŠããã¿ãŒããã«ãŠã£ã³ããŠã«åºåããããŸããã
A: You may not be running the Smee client, running the Smee command with the wrong parameters or you may not have the correct Smee domain in your GitHub App settings. ãŸããã¿ãŒããã«ã®ã¿ãã§Smeeã®ã¯ã©ã€ã¢ã³ããåäœããŠãããã確èªããŠãã ããã ãããããåé¡ã§ã¯ãªããªãããã¢ããªã±ãŒã·ã§ã³ã®èšå®ããŒãžã«ã¢ã¯ã»ã¹ããã¹ããã2 æ°ããGitHub Appã®ç»é²ãã§ç€ºãããŠãããã£ãŒã«ãã確èªããŠãã ããã ãããã®ãã£ãŒã«ãå ã®ãã¡ã€ã³ããã¹ããã1 æ°ããSmeeãã£ã³ãã«ã®éå§"ã®
smee -u <unique_channel>
ã³ãã³ãã§äœ¿ã£ããã¡ã€ã³ãšäžèŽããããšã確èªããŠãã ããã If none of the above work, check that you are running the full Smee command including the--path
and--port
options, for example:smee --url https://smee.io/qrfeVRbFbffd6vD --path /event_handler --port 3000
(replacinghttps://smee.io/qrfeVRbFbffd6vD
with your own Smee domain). -
Q: ãããã°åºåã«
Octokit::NotFound
404ãšã©ãŒãåºãŸãã2018-12-06 15:00:56 - Octokit::NotFound - POST https://api.github.com/app/installations/500991/access_tokens: 404 - Not Found // See: /v3/apps/#create-a-new-installation-token:
A:
.env
ãã¡ã€ã«å ã®å€æ°ãæ£ããããšã確èªããŠãã ãããbash_profile
ã®ãããªä»ã®ç°å¢å€æ°ãã¡ã€ã«ã§åãå€æ°ãèšå®ããŠããªãããšã確èªããŠãã ããã ã¢ããªã±ãŒã·ã§ã³ã䜿çšããŠããç°å¢å€æ°ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã³ãŒãã«puts
æãè¿œå ããŠå®è¡ãçŽãããšã§ç¢ºèªã§ããŸãã ããšãã°ãæ£ããç§å¯éµãèšå®ãããŠãããã確èªããã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã³ãŒãã«puts PRIVATE_KEY
ãè¿œå ã§ããŸããPRIVATE_KEY = OpenSSL::PKey::RSA.new(ENV['GITHUB_PRIVATE_KEY'].gsub('\n', "\n")) puts PRIVATE_KEY
ãã®ã¬ã€ããèŠçµããã°ãGitHub Appãéçºããããã®åºæ¬çãªãã«ãã£ã³ã°ãããã¯ãåŠãã ããšã«ãªããŸã! æ¯ãè¿ããšã以äžãè¡ããŸããã
- æ°ããGitHub Appã®ç»é²
- Smeeã䜿ã£ãŠwebhookã®ãã€ããŒããåä¿¡
- Sinatraã§ã·ã³ãã«ãªWebãµãŒããŒãå®è¡
- GitHub AppãšããŠèªèšŒ
- ã€ã³ã¹ããŒã«ãšããŠèªèšŒ
ããã§GitHub AppããµãŒããŒäžã§åäœãããããšãã§ããŸããã ãŸã ããã¯ç¹å¥ãªããšã¯äœãããŠããŸããããä»ã®ã¯ã€ãã¯ã¹ã¿ãŒãã¬ã€ãã§GitHub Appãã³ãã¬ãŒããã«ã¹ã¿ãã€ãºããæ¹æ³ã調ã¹ãŠã¿ãŠãã ããã