Введение
В этом руководстве показано, как написать код для создания GitHub App, выполняющего запрос API в ответ на событие веб-перехватчика. В частности, когда запрос на вытягивание открыт в репозитории, к которому был предоставлен доступ, приложение получит событие веб-перехватчика запроса на вытягивание. Затем приложение будет использовать API GitHub, чтобы добавить комментарий в запрос на вытягивание.
В этом руководстве вы будете использовать компьютер или пространство кода в качестве сервера при разработке приложения. После того как приложение будет готово к использованию в рабочей среде, необходимо развернуть приложение на выделенном сервере.
В этом руководстве используется JavaScript, но вы можете использовать любой язык программирования, который можно запустить на сервере.
Сведения о веб-перехватчиках
При регистрации GitHub Appможно указать URL-адрес веб-перехватчика и подписаться на события веб-перехватчика. Когда действие на GitHub активирует событие, на которое подписано ваше приложение, GitHub отправляет событие веб-перехватчика в URL-адрес веб-перехватчика приложения.
Например, вы можете подписать данные GitHub App на событие веб-перехватчика запроса на вытягивание. Когда запрос на вытягивание открывается в репозитории, к которому приложению предоставлен доступ, GitHub отправляет событие веб-перехватчика запроса на вытягивание в URL-адрес веб-перехватчика приложения. Если несколько действий могут активировать событие, полезные данные события будут содержать action поле, указывающее, какой тип действия активировал событие. В этом примере значение action будет иметь opened значение, так как событие было активировано, так как был открыт запрос на вытягивание.
Если приложение запущено на сервере, который прослушивает эти события веб-перехватчика, ваше приложение может выполнить действие при получении события веб-перехватчика. Например, приложение может использовать API GitHub для публикации комментария в запрос на вытягивание при получении события веб-перехватчика запроса на вытягивание.
Дополнительные сведения см. в разделе Использование вебхуков с приложениями GitHub. Сведения о возможных событиях и действиях веб-перехватчика см. в разделе События и полезные данные веб-перехватчика.
Необходимые компоненты
В этом руководстве требуется, чтобы компьютер или пространство кода выполняли Node.js версии 20 или более поздней и npm версии 6.12.0 или более поздней. Дополнительные сведения см. в Node.js.
В этом руководстве предполагается, что у вас есть базовое представление о синтаксисе JavaScript и ES6.
Настройка
В следующих разделах вы узнаете, как настроить следующие компоненты:
- Репозиторий для хранения кода для приложения
- Способ локального получения веб-перехватчиков
- Регистрация GitHub App, которая подписана на события веб-перехватчика "запрос на вытягивание", имеет разрешение на добавление комментариев к запросам на вытягивание и использование URL-адреса веб-перехватчика, который можно получить локально.
Создание репозитория для хранения кода для приложения
- Создайте репозиторий для хранения кода для приложения. Дополнительные сведения см. в разделе Создание репозитория.
- Клонируйте репозиторий на предыдущем шаге. Дополнительные сведения см. в разделе Клонирование репозитория. Вы можете использовать локальный клон или GitHub Codespaces.
- В терминале перейдите в каталог, в котором хранится клон.
- Если каталог еще не содержит
.gitignoreфайл, добавьте.gitignoreфайл. Позже вы добавите содержимое в этот файл. Дополнительные сведения о файлах см. в.gitignoreразделе Пропуск файлов.
Вы добавите дополнительный код в этот репозиторий на последующих шагах.
Получение URL-адреса прокси-сервера веб-перехватчика
Для локальной разработки приложения можно использовать URL-адрес прокси-сервера веб-перехватчика для пересылки веб-перехватчиков из GitHub на компьютер или пространство кода. В этом руководстве используется Smee.io для предоставления URL-адреса прокси-сервера веб-перехватчика и перенаправления веб-перехватчиков.
- В браузере перейдите по адресу https://smee.io/.
- Нажмите кнопку " Пуск нового канала".
- Скопируйте полный URL-адрес в разделе "URL-адрес прокси-сервера веб-перехватчика". Этот URL-адрес будет использоваться на следующем шаге.
Регистрация GitHub App
Для работы с этим руководством необходимо зарегистрировать GitHub App, что:
- Имеет активные веб-перехватчики
- Использует URL-адрес веб-перехватчика, который можно получить локально
- Имеет разрешение репозитория "Запрос на вытягивание"
- Подписывается на событие веб-перехватчика "Запрос на вытягивание"
Следующие действия помогут вам зарегистрировать GitHub App с помощью этих параметров. Дополнительные сведения о параметрах GitHub App см. в разделе Регистрация приложения GitHub.
-
В правом верхнем углу любой страницы на GitHubщелкните рисунок профиля.
-
Перейдите к настройкам учетной записи.
- Для приложения, принадлежащих личная учетная запись, нажмите кнопку "Параметры".
- Для приложения, принадлежащих организации:
- Щелкните Your organizations (Ваши организации).
- Справа от организации нажмите кнопку "Параметры".
- Для приложения, принадлежающего предприятия:
- Щелкните "Параметры предприятия".
-
Перейдите к параметрам GitHub App .
- Для приложения, принадлежащих личная учетная запись или организации:
- На левой боковой панели щелкните Параметры разработчика, а затем выберите GitHub Apps.
- Для приложения, принадлежаемого предприятием:
- На левой боковой панели щелкните "Параметры **", а затем щелкните **GitHub Apps.
- Для приложения, принадлежащих личная учетная запись или организации:
-
Щелкните "Создать" GitHub App.
-
В поле "GitHub App name" введите имя приложения. Например,
USERNAME-webhook-test-appгдеUSERNAMEнаходится имя пользователя GitHub. -
В разделе "URL-адрес домашней страницы" введите URL-адрес приложения. Например, можно использовать URL-адрес репозитория, созданного для хранения кода приложения.
-
Пропустите разделы "Идентификация и авторизация пользователей" и "После установки" для этого руководства. Дополнительные сведения об этих параметрах см. в разделе Регистрация приложения GitHub.
-
Убедитесь, что параметр "Активный " выбран в разделе "Веб-перехватчики".
-
В разделе "URL-адрес веб-перехватчика" введите URL-адрес прокси-сервера веб-перехватчика ранее. Дополнительные сведения см. в разделе "Получение URL-адреса прокси-сервера веб-перехватчика".
-
В разделе "Секрет веб-перехватчика" введите случайную строку. Эта строка будет использоваться позже.
-
В разделе "Разрешения репозитория" рядом с пунктом "Запросы на вытягивание" выберите "Чтение и запись".
-
В разделе "Подписка на события" выберите запрос на вытягивание.
-
В разделе "Где можно установить данные GitHub App?", выберите только в этой учетной записи. Это можно изменить позже, если вы хотите опубликовать приложение.
Примечание.
Если данные GitHub App зарегистрированы в организации, этот шаг не применяется.
-
Нажмите кнопку "Создать GitHub App.
Написание кода для приложения
В следующих разделах вы узнаете, как писать код, чтобы приложение ответило на события веб-перехватчика.
Установка зависимостей
В этом руководстве используется модуль GitHubдля octokit обработки событий веб-перехватчика и выполнения запросов API. Дополнительные сведения о Octokit.js см. в разделе Скриптирование с помощью REST API и JavaScript и Octokit.js README.
В этом руководстве dotenv модуль используется для чтения сведений .env о приложении из файла. Дополнительные сведения см. в разделе dotenv.
В этом руководстве используется Smee.io для пересылки веб-перехватчиков из GitHub на локальный сервер. Дополнительные сведения см. в разделе smee-client.
- В терминале перейдите в каталог, в котором хранится клон.
- Запустите
npm init --yes, чтобы создатьpackage.jsonфайл с помощью значений по умолчанию npm. - Выполните
npm install octokit. - Выполните
npm install dotenv. - Выполните
npm install smee-client --save-dev. Так как при разработке приложения вы будете использовать только Smee.io для пересылки веб-перехватчиков, это зависимость разработки. - Добавьте
node_modulesв.gitignoreфайл.
Хранение сведений и учетных данных приложения
В этом руководстве показано, как хранить учетные данные приложения и определять их как переменные среды в .env файле. При развертывании приложения необходимо изменить способ хранения учетных данных. Дополнительные сведения см. в разделе "Развертывание приложения".
Прежде чем выполнять эти действия, убедитесь, что вы находитесь на защищенном компьютере, так как вы будете хранить учетные данные локально.
-
В терминале перейдите в каталог, в котором хранится клон.
-
Создайте файл, вызывающийся
.envна верхнем уровне этого каталога. -
Добавьте
.envв.gitignoreфайл. Это позволит предотвратить случайное фиксацию учетных данных приложения. -
Добавьте в файл следующее содержимое
.env. ЗаменитеYOUR_HOSTNAMEименем ваш экземпляр GitHub Enterprise Server. Вы обновите другие значения на следующем шаге.Text APP_ID="YOUR_APP_ID" WEBHOOK_SECRET="YOUR_WEBHOOK_SECRET" PRIVATE_KEY_PATH="YOUR_PRIVATE_KEY_PATH" ENTERPRISE_HOSTNAME="YOUR_HOSTNAME"
APP_ID="YOUR_APP_ID" WEBHOOK_SECRET="YOUR_WEBHOOK_SECRET" PRIVATE_KEY_PATH="YOUR_PRIVATE_KEY_PATH" ENTERPRISE_HOSTNAME="YOUR_HOSTNAME" -
Перейдите на страницу параметров приложения:
-
В правом верхнем углу любой страницы на GitHubщелкните рисунок профиля.
-
Перейдите к настройкам учетной записи.
- Для приложения, принадлежащих личная учетная запись, нажмите кнопку "Параметры".
- Для приложения, принадлежащих организации:
- Щелкните Your organizations (Ваши организации).
- Справа от организации нажмите кнопку "Параметры".
- Для приложения, принадлежающего предприятия:
- Щелкните "Параметры предприятия".
-
На левой боковой панели щелкните Параметры разработчика.
-
На левой боковой панели щелкните GitHub Apps.
-
Рядом с именем приложения нажмите кнопку "Изменить".
-
-
На странице параметров приложения рядом с идентификатором приложения найдите идентификатор приложения.
-
`.env` В файле замените `YOUR_APP_ID` идентификатор приложения. -
На странице параметров приложения в разделе "Закрытые ключи" нажмите кнопку "Создать закрытый ключ". Вы увидите скачанный на компьютер закрытый ключ в формате PEM. Дополнительные сведения см. в разделе Управление приватными ключами для приложений GitHub.
-
Если вы используете пространство кода, переместите скачанный PEM-файл в пространство кода, чтобы пространство кода могли получить доступ к файлу.
-
`.env` В файле замените `YOUR_PRIVATE_KEY_PATH` полный путь к закрытому ключу, включая `.pem` расширение. -
`.env` В файле замените `YOUR_WEBHOOK_SECRET` секрет веб-перехватчика для приложения. Если вы забыли секрет веб-перехватчика, в разделе "Секрет веб-перехватчика (необязательно)" нажмите кнопку **"Изменить секрет**". Введите новый секрет и нажмите кнопку **"Сохранить изменения**".
Добавление кода для реагирования на события веб-перехватчика
На верхнем уровне каталога, в котором хранится клон, создайте файл JavaScript для хранения кода для приложения. В этом руководстве будет присвоено имя файла app.js.
Добавьте в раздел app.js следующий код. Код содержит заметки, объясняющие каждую часть.
// These are the dependencies for this file.
//
// You installed the `dotenv` and `octokit` modules earlier. The `@octokit/webhooks` is a dependency of the `octokit` module, so you don't need to install it separately. The `fs` and `http` dependencies are built-in Node.js modules.
import dotenv from "dotenv";
import {App, Octokit from "octokit";
import {createNodeMiddleware} from "@octokit/webhooks";
import fs from "fs";
import http from "http";
// This reads your `.env` file and adds the variables from that file to the `process.env` object in Node.js.
dotenv.config();
// This assigns the values of your environment variables to local variables.
const appId = process.env.APP_ID;
const webhookSecret = process.env.WEBHOOK_SECRET;
const privateKeyPath = process.env.PRIVATE_KEY_PATH;
const enterpriseHostname = process.env.ENTERPRISE_HOSTNAME;
// This reads the contents of your private key file.
const privateKey = fs.readFileSync(privateKeyPath, "utf8");
// This creates a new instance of the Octokit App class.
const app = new App({
appId: appId,
privateKey: privateKey,
webhooks: {
secret: webhookSecret
},
Octokit: Octokit.defaults({
baseUrl: `https://${enterpriseHostname}/api/v3`,
}),
});
// This defines the message that your app will post to pull requests.
const messageForNewPRs = "Thanks for opening a new PR! Please follow our contributing guidelines to make your PR easier to review.";
// This adds an event handler that your code will call later. When this event handler is called, it will log the event to the console. Then, it will use GitHub's REST API to add a comment to the pull request that triggered the event.
async function handlePullRequestOpened({octokit, payload}) {
console.log(`Received a pull request event for #${payload.pull_request.number}`);
try {
await octokit.request("POST /repos/{owner}/{repo}/issues/{issue_number}/comments", {
owner: payload.repository.owner.login,
repo: payload.repository.name,
issue_number: payload.pull_request.number,
body: messageForNewPRs,
headers: {
"x-github-api-version": "2022-11-28",
},
});
} catch (error) {
if (error.response) {
console.error(`Error! Status: ${error.response.status}. Message: ${error.response.data.message}`)
}
console.error(error)
}
};
// This sets up a webhook event listener. When your app receives a webhook event from GitHub with a `X-GitHub-Event` header value of `pull_request` and an `action` payload value of `opened`, it calls the `handlePullRequestOpened` event handler that is defined above.
app.webhooks.on("pull_request.opened", handlePullRequestOpened);
// This logs any errors that occur.
app.webhooks.onError((error) => {
if (error.name === "AggregateError") {
console.error(`Error processing request: ${error.event}`);
} else {
console.error(error);
}
});
// This determines where your server will listen.
//
// For local development, your server will listen to port 3000 on `localhost`. When you deploy your app, you will change these values. For more information, see [Deploy your app](#deploy-your-app).
const port = 3000;
const host = 'localhost';
const path = "/api/webhook";
const localWebhookUrl = `http://${host}:${port}${path}`;
// This sets up a middleware function to handle incoming webhook events.
//
// Octokit's `createNodeMiddleware` function takes care of generating this middleware function for you. The resulting middleware function will:
//
// - Check the signature of the incoming webhook event to make sure that it matches your webhook secret. This verifies that the incoming webhook event is a valid GitHub event.
// - Parse the webhook event payload and identify the type of event.
// - Trigger the corresponding webhook event handler.
const middleware = createNodeMiddleware(app.webhooks, {path});
// This creates a Node.js server that listens for incoming HTTP requests (including webhook payloads from GitHub) on the specified port. When the server receives a request, it executes the `middleware` function that you defined earlier. Once the server is running, it logs messages to the console to indicate that it is listening.
http.createServer(middleware).listen(port, () => {
console.log(`Server is listening for events at: ${localWebhookUrl}`);
console.log('Press Ctrl + C to quit.')
});
import dotenv from "dotenv";
import {App, Octokit from "octokit";
import {createNodeMiddleware} from "@octokit/webhooks";
import fs from "fs";
import http from "http";These are the dependencies for this file.
You installed the dotenv and octokit modules earlier. The @octokit/webhooks is a dependency of the octokit module, so you don't need to install it separately. The fs and http dependencies are built-in Node.js modules.
dotenv.config();This reads your .env file and adds the variables from that file to the process.env object in Node.js.
const appId = process.env.APP_ID;
const webhookSecret = process.env.WEBHOOK_SECRET;
const privateKeyPath = process.env.PRIVATE_KEY_PATH;
const enterpriseHostname = process.env.ENTERPRISE_HOSTNAME;This assigns the values of your environment variables to local variables.
const privateKey = fs.readFileSync(privateKeyPath, "utf8");This reads the contents of your private key file.
const app = new App({
appId: appId,
privateKey: privateKey,
webhooks: {
secret: webhookSecret
},
Octokit: Octokit.defaults({
baseUrl: `https://${enterpriseHostname}/api/v3`,
}),
});This creates a new instance of the Octokit App class.
const messageForNewPRs = "Thanks for opening a new PR! Please follow our contributing guidelines to make your PR easier to review.";This defines the message that your app will post to pull requests.
async function handlePullRequestOpened({octokit, payload}) {
console.log(`Received a pull request event for #${payload.pull_request.number}`);
try {
await octokit.request("POST /repos/{owner}/{repo}/issues/{issue_number}/comments", {
owner: payload.repository.owner.login,
repo: payload.repository.name,
issue_number: payload.pull_request.number,
body: messageForNewPRs,
headers: {
"x-github-api-version": "2022-11-28",
},
});
} catch (error) {
if (error.response) {
console.error(`Error! Status: ${error.response.status}. Message: ${error.response.data.message}`)
}
console.error(error)
}
};This adds an event handler that your code will call later. When this event handler is called, it will log the event to the console. Then, it will use GitHub's REST API to add a comment to the pull request that triggered the event.
app.webhooks.on("pull_request.opened", handlePullRequestOpened);This sets up a webhook event listener. When your app receives a webhook event from GitHub with a X-GitHub-Event header value of pull_request and an action payload value of opened, it calls the handlePullRequestOpened event handler that is defined above.
app.webhooks.onError((error) => {
if (error.name === "AggregateError") {
console.error(`Error processing request: ${error.event}`);
} else {
console.error(error);
}
});This logs any errors that occur.
const port = 3000;
const host = 'localhost';
const path = "/api/webhook";
const localWebhookUrl = `http://${host}:${port}${path}`;This determines where your server will listen.
For local development, your server will listen to port 3000 on localhost. When you deploy your app, you will change these values. For more information, see Deploy your app.
const middleware = createNodeMiddleware(app.webhooks, {path});This sets up a middleware function to handle incoming webhook events.
Octokit's createNodeMiddleware function takes care of generating this middleware function for you. The resulting middleware function will:
- Check the signature of the incoming webhook event to make sure that it matches your webhook secret. This verifies that the incoming webhook event is a valid GitHub event.
- Parse the webhook event payload and identify the type of event.
- Trigger the corresponding webhook event handler.
http.createServer(middleware).listen(port, () => {
console.log(`Server is listening for events at: ${localWebhookUrl}`);
console.log('Press Ctrl + C to quit.')
});This creates a Node.js server that listens for incoming HTTP requests (including webhook payloads from GitHub) on the specified port. When the server receives a request, it executes the middleware function that you defined earlier. Once the server is running, it logs messages to the console to indicate that it is listening.
// These are the dependencies for this file.
//
// You installed the `dotenv` and `octokit` modules earlier. The `@octokit/webhooks` is a dependency of the `octokit` module, so you don't need to install it separately. The `fs` and `http` dependencies are built-in Node.js modules.
import dotenv from "dotenv";
import {App, Octokit from "octokit";
import {createNodeMiddleware} from "@octokit/webhooks";
import fs from "fs";
import http from "http";
// This reads your `.env` file and adds the variables from that file to the `process.env` object in Node.js.
dotenv.config();
// This assigns the values of your environment variables to local variables.
const appId = process.env.APP_ID;
const webhookSecret = process.env.WEBHOOK_SECRET;
const privateKeyPath = process.env.PRIVATE_KEY_PATH;
const enterpriseHostname = process.env.ENTERPRISE_HOSTNAME;
// This reads the contents of your private key file.
const privateKey = fs.readFileSync(privateKeyPath, "utf8");
// This creates a new instance of the Octokit App class.
const app = new App({
appId: appId,
privateKey: privateKey,
webhooks: {
secret: webhookSecret
},
Octokit: Octokit.defaults({
baseUrl: `https://${enterpriseHostname}/api/v3`,
}),
});
// This defines the message that your app will post to pull requests.
const messageForNewPRs = "Thanks for opening a new PR! Please follow our contributing guidelines to make your PR easier to review.";
// This adds an event handler that your code will call later. When this event handler is called, it will log the event to the console. Then, it will use GitHub's REST API to add a comment to the pull request that triggered the event.
async function handlePullRequestOpened({octokit, payload}) {
console.log(`Received a pull request event for #${payload.pull_request.number}`);
try {
await octokit.request("POST /repos/{owner}/{repo}/issues/{issue_number}/comments", {
owner: payload.repository.owner.login,
repo: payload.repository.name,
issue_number: payload.pull_request.number,
body: messageForNewPRs,
headers: {
"x-github-api-version": "2022-11-28",
},
});
} catch (error) {
if (error.response) {
console.error(`Error! Status: ${error.response.status}. Message: ${error.response.data.message}`)
}
console.error(error)
}
};
// This sets up a webhook event listener. When your app receives a webhook event from GitHub with a `X-GitHub-Event` header value of `pull_request` and an `action` payload value of `opened`, it calls the `handlePullRequestOpened` event handler that is defined above.
app.webhooks.on("pull_request.opened", handlePullRequestOpened);
// This logs any errors that occur.
app.webhooks.onError((error) => {
if (error.name === "AggregateError") {
console.error(`Error processing request: ${error.event}`);
} else {
console.error(error);
}
});
// This determines where your server will listen.
//
// For local development, your server will listen to port 3000 on `localhost`. When you deploy your app, you will change these values. For more information, see [Deploy your app](#deploy-your-app).
const port = 3000;
const host = 'localhost';
const path = "/api/webhook";
const localWebhookUrl = `http://${host}:${port}${path}`;
// This sets up a middleware function to handle incoming webhook events.
//
// Octokit's `createNodeMiddleware` function takes care of generating this middleware function for you. The resulting middleware function will:
//
// - Check the signature of the incoming webhook event to make sure that it matches your webhook secret. This verifies that the incoming webhook event is a valid GitHub event.
// - Parse the webhook event payload and identify the type of event.
// - Trigger the corresponding webhook event handler.
const middleware = createNodeMiddleware(app.webhooks, {path});
// This creates a Node.js server that listens for incoming HTTP requests (including webhook payloads from GitHub) on the specified port. When the server receives a request, it executes the `middleware` function that you defined earlier. Once the server is running, it logs messages to the console to indicate that it is listening.
http.createServer(middleware).listen(port, () => {
console.log(`Server is listening for events at: ${localWebhookUrl}`);
console.log('Press Ctrl + C to quit.')
});
Добавление скрипта для запуска кода для приложения
-
`scripts` В объект в `package.json` файле добавьте скрипт, который выполняется `server``node app.js`. Например:JSON "scripts": { "server": "node app.js" }"scripts": { "server": "node app.js" }Если вы вызвали файл, содержащий код приложения, отличный от
app.jsдругого, заменитеapp.jsотносительный путь к файлу, в котором содержится код приложения. -
`package.json` В файле добавьте ключ `type` верхнего уровня со значением`module`. Например:{ // rest of the JSON object, "version": "1.0.0", "description": "", "type": "module", // rest of the JSON object, }
Файл package.json должен выглядеть примерно так. Значение name и номера версий dependencies в разделе и devDependencies могут отличаться.
{
"name": "github-app-webhook-tutorial",
"version": "1.0.0",
"description": "",
"main": "index.js",
"type": "module",
"scripts": {
"server": "node app.js"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"dotenv": "^16.0.3",
"octokit": "^2.0.14"
},
"devDependencies": {
"smee-client": "^1.2.3"
}
}
Тестирование
Выполните следующие действия, чтобы протестировать созданное выше приложение.
Установка приложения
Чтобы приложение оставило комментарий по запросам на вытягивание в репозитории, оно должно быть установлено в учетной записи, которая владеет репозиторием и предоставляет доступ к нему. Так как ваше приложение является частным, оно может быть установлено только в учетной записи, которая владеет приложением.
-
В учетной записи, владеющей созданным приложением, создайте новый репозиторий для установки приложения. Дополнительные сведения см. в разделе Создание репозитория.
-
Перейдите на страницу параметров приложения:
-
В правом верхнем углу любой страницы на GitHubщелкните рисунок профиля.
-
Перейдите к настройкам учетной записи.
- Для приложения, принадлежащих личная учетная запись, нажмите кнопку "Параметры".
- Для приложения, принадлежащих организации:
- Щелкните Your organizations (Ваши организации).
- Справа от организации нажмите кнопку "Параметры".
- Для приложения, принадлежающего предприятия:
- Щелкните "Параметры предприятия".
-
На левой боковой панели щелкните Параметры разработчика.
-
На левой боковой панели щелкните GitHub Apps.
-
Рядом с именем приложения нажмите кнопку "Изменить".
-
-
Щелкните общедоступную страницу.
-
Нажмите кнопку "Установить".
-
Выберите только определенные репозитории.
-
**Выберите раскрывающееся меню "Выбор репозиториев**" и выберите репозиторий, выбранный в начале этого раздела. -
Нажмите кнопку "Установить".
Запуск сервера
Для тестирования вы будете использовать компьютер или пространство кода в качестве сервера. Приложение будет реагировать только на веб-перехватчики при запуске сервера.
-
В терминале перейдите в каталог, в котором хранится код приложения.
-
Чтобы получить перенаправленные веб-перехватчики из Smee.io, выполните команду
npx smee -u WEBHOOK_PROXY_URL -t http://localhost:3000/api/webhook. ЗаменитеWEBHOOK_PROXY_URLURL-адрес прокси-сервера веб-перехватчика ранее. Если вы забыли URL-адрес, его можно найти в поле "URL-адрес веб-перехватчика" на странице параметров приложения.Вы увидите выходные данные, которые выглядят следующим образом, где
WEBHOOK_PROXY_URLнаходится URL-адрес прокси-сервера веб-перехватчика:Forwarding WEBHOOK_PROXY_URL to http://localhost:3000/api/webhook Connected WEBHOOK_PROXY_URL -
Во втором окне терминала перейдите в каталог, в котором хранится код приложения.
-
Выполните
npm run server. Ваш терминал должен сказать:Server is listening for events at: http://localhost:3000/api/webhook
Тестирование приложения
Теперь, когда сервер выполняется и получает события перенаправленных веб-перехватчиков, протестируйте приложение, открыв запрос на вытягивание в репозитории, выбранном при установке приложения.
-
Откройте запрос на вытягивание в репозитории, выбранном при установке приложения. Дополнительные сведения см. в разделе Создание запроса на включение изменений.
Обязательно используйте репозиторий, выбранный при установке приложения, а не репозиторий, в котором хранится код вашего приложения. Дополнительные сведения см. в разделе "Установка приложения".
-
Перейдите по URL-адресу прокси-сервера веб-перехватчика на smee.io. Должно появиться
pull_requestсобытие. Это означает, что GitHub успешно отправил событие запроса на вытягивание при создании запроса на вытягивание. -
В терминале, на котором вы выполнили,
npm run serverвы увидите примерно следующее: "Получено событие запроса на вытягивание для #1", где целое число после#того, как указано число открываемого запроса на вытягивание. -
На временной шкале запроса на вытягивание вы увидите комментарий из приложения.
-
В обоих окнах терминала введите CTRL+C, чтобы остановить сервер и прекратить прослушивание перенаправленных веб-перехватчиков.
Следующие шаги
Теперь, когда у вас есть приложение, реагирующее на события веб-перехватчика, может потребоваться развернуть код приложения, развернуть приложение и сделать приложение общедоступным.
Изменение кода приложения
В этом руководстве показано, как опубликовать комментарий по запросу на вытягивание при открытии запроса на вытягивание. Вы можете обновить код, чтобы реагировать на различные типы событий веб-перехватчика или делать что-то другое в ответ на событие веб-перехватчика.
Не забудьте обновить разрешения приложения, если вашему приложению требуются дополнительные разрешения для запросов API, которые вы хотите сделать или события веб-перехватчика, которые вы хотите получить. Дополнительные сведения см. в разделе Выбор разрешений для приложения GitHub.
В этом руководстве хранится весь код в одном файле, но может потребоваться переместить функции и компоненты в отдельные файлы.
Развертывание приложения
В этом руководстве показано, как разрабатывать приложение локально. Когда вы будете готовы к развертыванию приложения, необходимо внести изменения в обслуживание приложения и обеспечить безопасность учетных данных приложения. Действия, которые вы выполняете, зависят от используемого сервера, но в следующих разделах приведены общие рекомендации.
Размещение приложения на сервере
В этом руководстве используется компьютер или пространство кода в качестве сервера. После того как приложение будет готово к использованию в рабочей среде, необходимо развернуть приложение на выделенном сервере. Например, можно использовать Azure App Service.
Обновление URL-адреса веб-перехватчика
После установки сервера для получения трафика веб-перехватчика из GitHubобновите URL-адрес веб-перехватчика в параметрах приложения. Не следует использовать Smee.io для пересылки веб-перехватчиков в рабочей среде.
`port` Обновление констант и `host` констант
При развертывании приложения необходимо изменить узел и порт, где сервер прослушивает.
Например, можно задать переменную среды на сервере PORT , чтобы указать порт, где должен прослушивать сервер. Переменная среды на сервере NODE_ENVможет быть заданаproduction. Затем можно обновить место, в котором код определяет port и host константы, чтобы сервер прослушивал все доступные сетевые интерфейсы () вместо локального сетевого интерфейса (0.0.0.0``localhost) на порту развертывания:
const port = process.env.PORT || 3000; const host = process.env.NODE_ENV === 'production' ? '0.0.0.0' : 'localhost';
const port = process.env.PORT || 3000;
const host = process.env.NODE_ENV === 'production' ? '0.0.0.0' : 'localhost';
Защита учетных данных приложения
Вы никогда не должны публиковать закрытый ключ приложения или секрет веб-перехватчика. В этом руководстве хранятся учетные данные приложения в gitignored-файле .env . При развертывании приложения следует выбрать безопасный способ хранения учетных данных и обновления кода, чтобы получить соответствующее значение. Например, вы можете хранить учетные данные в секретной службе, такой как Azure Key Vault. При запуске приложения он может получить учетные данные и сохранить их в переменных среды на сервере, на котором развернуто приложение.
Дополнительные сведения см. в разделе Лучшие практики создания приложения на GitHub.
Общий доступ к приложению
Если вы хотите предоставить общий доступ к приложению другим пользователям и организациям, сделайте приложение общедоступным. Дополнительные сведения см. в разделе Как сделать приложение GitHub публичным или частным.
Применение рекомендаций
Вам следует следовать рекомендациям по использованию данных GitHub App. Дополнительные сведения см. в разделе Лучшие практики создания приложения на GitHub.