Это второй день моего участия в Gengwen Challenge.Подробности мероприятия смотрите:Обновить вызов
Боясь того, что истина бесконечна, каждый дюйм радости наполнен радостью. Привет всем, я@Луожу, практик, который учится на протяжении всей жизни, любит программирование и любит жизнь.
О приложениях Github
GitHub Apps — отличный продукт на GitHub. Приложение GitHub работает напрямую со своей собственной идентификацией через API, что означает, что вам не нужно поддерживать учетную запись бота или службы в качестве отдельного пользователя.
Приложения GitHub можно устанавливать непосредственно в учетные записи организации или пользователя, и им можно предоставить доступ к определенным репозиториям. Они поставляются со встроенными веб-перехватчиками и узкими специфическими разрешениями. Когда вы настраиваете свое приложение GitHub, вы можете выбрать, к каким репозиториям вы хотите получить доступ. Например, вы можете установитьMyGitHub
приложение, которое имеет и толькоoctocat
Запись на складissues
разрешение. Для установки приложения GitHub вы должны быть владельцем организации или иметь права администратора в репозитории.
О Проботе
Probot — это платформа для создания приложений GitHub на основе Node.js. Он предназначен для удаления всех утомительных вещей, таких как получение и проверка веб-перехватчиков и выполнение действий аутентификации, чтобы вы могли сосредоточиться на функциях, которые хотите реализовать. Приложения Probot очень легко писать, развертывать и делиться ими. Большинство популярных приложений Probot размещены на хостинге, поэтому вам не нужно выполнять какие-либо действия по развертыванию и управлению. Вот несколько приложений, созданных на Probot:
- ESLint Disable Watcher- Комментарий при попытке отключить правила eslint в пр.
- Developer Certificate of Origin- Force Pull Requests для соответствия DCO
- Issue Check- Проверяйте проблемы по ключевым словам и спискам задач, чтобы убедиться, что необходимая информация включена
- Pull - Keep your forks up-to-date.
ты сможешьПопулярные приложенияилиТема пробот-приложения на GitHubПросмотрите больше приложений.
Hello Probot
Приложение Probot по существу экспортирует функциюМодули Node.js:
module.exports = app => {
// your code here
};
app
параметрProbotЭкземпляр класса, который дает вам доступ ко всем преимуществам GitHub.
aap.on
отвечает за наблюдение за всемисобытия webhook, инициированные GitHub, он будет уведомлять вас, когда на GitHub происходит что-то интересное, о чем ваше приложение хочет знать.
module.exports = app => {
app.on('issues.opened', async context => {
// 一个新的 issue 被打开,我们应该做些什么呢?
context.log.info(context.payload);
});
};
Контекст, передаваемый обработчику событий, включает в себя все сведения об инициированном событии, а также некоторые полезные свойства для полезных ответов на событие.context.octokit
является сертифицированным клиентом GitHub, который можно использовать дляВыполнение вызовов REST API и GraphQL, и позволяет вам программно делать почти все, что вы можете делать на GitHub из браузера.
Ниже представлено приложение, которое автоматически комментирует при открытии новой проблемы.
module.exports = app => {
app.on('issues.opened', async context => {
// context` 从事件中提取信息,可以传递给 GitHub API 调用。这将返回:
// { owner: 'yourname', repo: 'yourrepo', number: 123, body: 'Hello World !}
const params = context.issue({ body: 'Hello World!' });
// 在 issue 上发一条评论
return context.octokit.issues.createComment(params);
});
};
Разработать приложение Probot
Чтобы разработать приложение Probot, вам сначала необходимо установить Node.js 10.0.0 или новее.
Создать новое приложение
create-probot-appэто лучший способ начать создание нового приложения. Он сгенерирует новое приложение со всем необходимым для начала работы и запуска вашего приложения в рабочей среде.
Запустите следующую команду, чтобы сгенерировать проект:
$ npx create-probot-app my-first-app
Эта команда задаст ряд вопросов о вашем приложении, которые выглядят следующим образом:
Let's create a Probot app!
? App name: my-first-app
? Description of app: A 'Hello World' GitHub App built with Probot.
? Author's full name: Katie Horne
? Author's email address: katie@auth0.com
? GitHub user or org name: khorne3
? Repository name: my-first-app
? Which template would you like to use? (Use arrow keys)
❯ basic-js
basic-ts (use this one for TypeScript support)
checks-js
git-data-js
deploy-js
Finished scaffolding files!
Installing dependencies. This may take a few minutes...
Successfully created my-first-app.
Begin using your app with:
cd my-first-app
npm start
View your app's README for more usage instructions.
Visit the Probot docs:
https://probot.github.io/docs/
Get help from the community:
https://probot.github.io/community/
Enjoy building your Probot app!
Создаются наиболее важные файлы.index.js
(где находится код вашего приложения) иpackage.json
(сделайте ваше приложение стандартнымnpm module).
Запустите приложение локально
Теперь вы готовы запустить приложение локально. бегатьnpm start
Запустим сервер:
Примечание. Если вы выбрали шаблон TypeScript, обязательно выполните
npm run build
!
$ yarn start
yarn run v1.22.10
$ probot run ./lib/index.js
INFO (server): Running Probot v11.3.0 (Node.js: v14.15.5)
INFO (server): Forwarding https://smee.io/dz7D1zur24cGNj7 to http://localhost:3000/
INFO (server): Listening on http://localhost:3000
INFO (server): Connected
Настроить приложение GitHub
Вот шаги для автоматической настройки приложения GitHub:
- Выполнить в локальной командной строке
npm start
. - доступhttp://localhost:3000См. следующий шаг.
- Вы увидите страницу, похожую на приведенную ниже.
- нажмитеRegister a GitHub Appкнопку, чтобы продолжить.
- Затем вам нужно дать вашему приложению незанятое имя, обратите внимание: если вы видите что-то вроде
Name is reserved for the account @tuya
, что означает, что вы не можете использовать название существующей организации GitHub в качестве имени своего приложения (если только вы не являетесь владельцем этой организации).
Время выпуска на гитхабеnpm publish
Целью реализации GitHub CI для автоматической публикации пакетов NPM является разумное управление внешними разрешениями на публикацию npm. Более распространенным временем выпуска является выпуск GitHub. Основываясь на анализе приведенной выше блок-схемы, мы видим, что освобожденное состояние выполняется.npm publish
Самый подходящий.
Конкретная логика, которую мы реализовали, заключается в том, что когда приложение Probot слушаетrelease.released
Когда событие, обрабатывает предварительно опубликованное действие. Важно то, что нам нужноpackage.json
серединаversion
Поле соответствует тегу, например:
- 1.0.0: 1.0.0 с тегом последняя
- 1.0.0-бета.0: 1.0.0-бета.0 с тегом бета
- 1.0.0-альфа.0: 1.0.0-альфа с тегом альфа
Принцип реализации автоматической публикации NPM
Перед публикацией нам нужно получить код хранилища, извлечь версию и тег и настроить токен публикации NPM. Начнем с кода ядра, а потом разберем его подробно.
app.on('release.released', async context => {
if (!isTuya(context)) return;
app.log('npm publishing');
const { repository: repo } = context.payload;
const downloadDefaultBranch = `${repo.full_name}#${context.payload.release.tag_name}`;
const downLoadTempDir = `${os.tmpdir()}/${repo.full_name}`;
await download(downloadDefaultBranch, downLoadTempDir);
const { version, scripts } = require(`${downLoadTempDir}/package.json`);
const tag = /^\d\.\d\.\d-(.*)\.\d$/.exec(version)
? /^\d\.\d\.\d-(.*)\.\d$/.exec(version)[1]
: 'latest';
// 如果有 build 脚本则先执行 build 脚本
if (scripts.build) {
await execSh(`cd ${downLoadTempDir} && npm install && npm run build`);
}
try {
const result = await npmPublish({
package: `${downLoadTempDir}/package.json`,
token: process.env.NPM_AUTH_TOKEN,
registry: 'https://registry.npmjs.org/',
tag,
});
if (result.type === 'none') {
app.log.error(
`You can't publish duplicate version ${result.package}@${result.version}`,
);
}
} catch (error) {
app.log.error(error);
}
});
NPM Publish Token
Подать заявку на токен публикации NPM
1. Посетите npmjs.com, чтобы перейти на страницу токенов доступа.
2. Нажмите кнопку «Создать новый токен».
3. Выберите «Опубликовать» в качестве типа токена.
Гарантия безопасности токена публикации NPM
Токен NPM не может быть виден другим.Для достижения этой цели сначала необходимо установить проект как частный, а затем токен должен быть помещен в.env
в, черезprocess.env.NPM_AUTH_TOKEN
Получать. Также не забудьте не печатать переменные среды в журнале.
Защита вашего приложения GitHub
Если приложение GitHub опубликовано как общедоступное, любой репозиторий может установить приложение, а это не то, что нам нужно. Есть два решения: одно — зарегистрировать приложение как частный тип, а другое — определить, является ли оно разрешенной организацией или пользователем в обратном вызове слушателя. Я выбрал вторую схему, а функция проверки такова:
const isTuya = context => {
const { full_name } = context.payload.repository;
return full_name.startsWith('youngjuning') || full_name.startsWith('tuya');
};
Скачать исходный код
Мы выбрали download-git-repo для загрузки репозитория git, но репозиторий не поддерживает Promise, сделаем простое преобразование:
const download = require('download-git-repo');
module.exports = (repo, tempDir) => {
return new Promise((resolve, reject) => {
download(repo, tempDir, err => {
if (err) {
reject(err);
} else {
resolve(null);
}
});
});
};
npmPublish
Мы выбрали @jsdevtools/npm-publish для выполнения действия публикации, репозиторий доступен как действие GitHub и инструмент командной строки в дополнение к программному вызову. Следует отметить, что нам нужно использовать регулярные выражения для извлечения тегов, которые мы хотим опубликовать:
const tag = /^\d\.\d\.\d-(.*)\.\d$/.exec(version)
? /^\d\.\d\.\d-(.*)\.\d$/.exec(version)[1]
: 'latest';
lerna publish
Версия управления lerna не может использовать процесс выпуска, упомянутый выше, потому что он может выпускать несколько репозиториев одновременно. Для lerna процесс выпуска, который я разработал, заключается в том, чтобы взять последний коммит после прослушивания действия push и сопоставить, содержит ли онchore(release): publish
. Конкретные принципы заключаются в следующем:
- Определите, является ли ветвь push главной ветвью, а информация фиксации содержит
chore(release): publish
- Поскольку это lerna publish, вам нужно использовать библиотеку simple-git для клонирования проекта.
- спасибо лерна опубликоватьтокен не поддерживается, мы используем
//registry.npmjs.org/:_authToken=${process.env.NPM_AUTH_TOKEN}
написать.npmrc
способ завершить выпуск с токеном. - Наконец, нам нужно использовать
from-git
способ выполнитьlerna publish
,from-git
Сценарий локального исполненияlerna version
, выполненный в CIlerna publish
.
Полный код выглядит следующим образом:
app.on('push', async context => {
if (!isTuya(context)) return;
if (
context.payload.ref.indexOf(context.payload.repository.default_branch) !==
-1 &&
context.payload.head_commit.message.indexOf('chore(release): publish') === 0
) {
app.log('push event');
execSh(`git --version`);
const { repository: repo } = context.payload;
const cloneTempDir = `${os.tmpdir()}/${repo.full_name}`;
try {
await git.clone(repo.clone_url, cloneTempDir);
const { devDependencies } = require(`${cloneTempDir}/package.json`);
if (devDependencies['lerna']) {
app.log('lerna publishing');
await execSh(
`cd ${cloneTempDir} && echo //registry.npmjs.org/:_authToken=${process.env.NPM_AUTH_TOKEN} > .npmrc`,
);
await execSh(
`cd ${cloneTempDir} && npm install && npm run build && ./node_modules/.bin/lerna publish from-git --yes --no-verify-access`,
);
}
await execSh(`rm -rf ${cloneTempDir}`);
} catch (error) {
await execSh(`rm -rf ${cloneTempDir}`);
}
}
});
Развертывание с ошибкой
Если у вас есть собственный сервер, вы можете развернуть бота прямо на своем сервере. Здесь я использую официально рекомендованное развертывание сервиса Glitch. Glitch может бесплатно размещать приложения узлов и редактировать их прямо в браузере. Достаточно для простых приложений.
- зарегистрироваться иGlitchСоздайте новый проект, выберитеImport from GitHub, напишите во всплывающем окне адрес приложения на гитхабе или используйтеGitHub.com/behavior бот…Импортировав его в качестве шаблона, скопируйте собственный код.
- Открыть
.env
файл со следующим вместо этого:
APP_ID=<your app id>
WEBHOOK_SECRET=<your app secret>
PRIVATE_KEY_PATH=<your private_key>
NODE_ENV=production
NPM_AUTH_TOKEN=3c2c104e-9f1f-4fc5-903e-726610b75ce1
INPUT_TOKEN=
- Просто установите ссылку на сбой на адрес веб-перехватчика приложения GitHub, затем обновите код, и сбой автоматически обновит развертывание.
разрешение
Начальные разрешения приложения Probot находятся вapp.yml
файл, если приложение было создано и вы хотите обновить разрешения, вы можетеGitHub.com/settings/AP…обновление в. Пожалуйста, нажмите на конфигурацию разрешений, которую я используюapp.ymlПроверить.
Эта статья была впервые опубликована в "Официальный сайт Луожу", синхронизировано с официальным аккаунтом"Дом утреннего чая в Луочжу"и"Колонка самородков".