Внедрить робота публикации GitHub NPM на основе Probot🤖

внешний интерфейс GitHub
Внедрить робота публикации GitHub NPM на основе Probot🤖

Это второй день моего участия в 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:

  1. Выполнить в локальной командной строкеnpm start.
  2. доступhttp://localhost:3000См. следующий шаг.
  3. Вы увидите страницу, похожую на приведенную ниже.

  1. нажмитеRegister a GitHub Appкнопку, чтобы продолжить.
  2. Затем вам нужно дать вашему приложению незанятое имя, обратите внимание: если вы видите что-то вроде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. Конкретные принципы заключаются в следующем:

  1. Определите, является ли ветвь push главной ветвью, а информация фиксации содержитchore(release): publish
  2. Поскольку это lerna publish, вам нужно использовать библиотеку simple-git для клонирования проекта.
  3. спасибо лерна опубликоватьтокен не поддерживается, мы используем//registry.npmjs.org/:_authToken=${process.env.NPM_AUTH_TOKEN}написать.npmrcспособ завершить выпуск с токеном.
  4. Наконец, нам нужно использовать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 может бесплатно размещать приложения узлов и редактировать их прямо в браузере. Достаточно для простых приложений.

  1. зарегистрироваться иGlitchСоздайте новый проект, выберитеImport from GitHub, напишите во всплывающем окне адрес приложения на гитхабе или используйтеGitHub.com/behavior бот…Импортировав его в качестве шаблона, скопируйте собственный код.
  2. Открыть.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=
  1. Просто установите ссылку на сбой на адрес веб-перехватчика приложения GitHub, затем обновите код, и сбой автоматически обновит развертывание.

разрешение

Начальные разрешения приложения Probot находятся вapp.ymlфайл, если приложение было создано и вы хотите обновить разрешения, вы можетеGitHub.com/settings/AP…обновление в. Пожалуйста, нажмите на конфигурацию разрешений, которую я используюapp.ymlПроверить.

Эта статья была впервые опубликована в "Официальный сайт Луожу", синхронизировано с официальным аккаунтом"Дом утреннего чая в Луочжу"и"Колонка самородков".