Github / Gitlab WebHook Интерфейс Разработчик Разработчика

GitHub GitLab

Некоторое время назад я хотел разработать интерфейс, чтобы потянуть файлы из GitLab / Github через веб -ook и загрузить указанный OS, поэтому я нашел официальные документы GitHub и Gitlab.

Конечно, официальные документы слишком длинные, особенно версия GitLab, созданная компанией, может быть несовместимой, поэтому вы можете только посмотреть информацию о документе, предоставленную построенным GitLab.В случае возникновения некоторых проблем вам необходимо проверить версию.

Конечно, к счастью, кроме версии интерфейса, крупных ям нет. Если возникнут проблемы, можно и по версии проверить. Можно сказать, что это однозначно преимущество строгого следования RESTful API, который и GitHub и GitLab показали себя очень хорошо.

Поскольку GitLab и GitHub используют два набора интерфейсов, здесь они представлены отдельно, но методы одинаковы:

Извлеките сжатый пакет, распакуйте его и загрузите файл. Другой способgit cloneвниз, но чувствуюgit cloneЭто все еще было слишком много проблем, поэтому я решил потянуть сжатый пакет.

GitLab

Интерфейс для загрузки сжатого пакета:docs.git lab.com/ohoh/api/repo…

Здесь есть два параметра:

id (required) - The ID or URL-encoded path of the project owned by the authenticated user
sha (optional) - The commit SHA to download defaults to the tip of the default branch

Здесь необходимы две части информации, id и sha проекта, обе из которых можно получить через Webhook:

const { checkout_sha: checkoutSha, project_id: projectId } = body

Но разница в том, что id помещается в параметр (param), а sha передается в виде строки запроса (GitHub отличается от него), если sha не передается, по умолчанию используется последний код ветки master .

Конечно, мы также установим секретный токен, доступ к которому можно получить через заголовокx-gitlab-tokenполучать.

Затем мы получили актуальную информацию о GitLab.

Если контент, полученный в API, требует разрешения, вы можете использоватьPRIVATE-TOKENЭтот заголовок передается в токен.

GitHub

Интерфейс GitHub Webhook немного отличается от GitLab, здесь мы по-прежнему используем версию V3 интерфейса Restful.

Самая важная вещь в веб-перехватчике GitHub — это то, как вычислить секретный токен, чтобы он соответствовал тому, что мы изначально установили. GitHub не так прост, как GitLab, нам нужно сначала сделать некоторые расчеты, которые можно увидеть в деталях.Validating payloads from GitHub, не имеет значения, если вы не понимаете Ruby, вот кусок JavaScript:

const strBody = JSON.stringify(body); // 将整个 body 带出去变成 string
const sign = crypto.createHmac("sha1", secretKey) // secretKey 为你需要核对的 token
  .update(strBody)
  .digest("hex"); // 加密成十六进制
ctx.assert(ctx.header["x-hub-signature"].replace("sha1=", "") === sign, 403, "Wrong Sign");

Затем поместите заголовокx-hub-signatureс участиемsha1=valueзначение в иsignПросто сделайте сравнение.

Во-вторых, GitHub должен передать заголовокx-github-eventЧтобы судить о типе события, иначе будет ошибка, содержимое разных событий может быть разным, нужно сделать какую-то специальную обработку для пинга, если это пинг, вернуть 200 напрямую, чтобы можно было пройти проверку GitHub .

Из тела запроса вы также можете найти информацию о репозитории и соответствующую информацию о фиксации, а также вы можете получить информацию об организации репозитория (здесь нам не нужна организация репозитория, поэтому мы не будем ее описывать сейчас)

const { repository, head, head_commit: headCommit } = body;

Нужный нам интерфейс:

https://github.com/${org}/${repositoryName}/archive/${sha}.zip

в:

repositoryName = repository.name
sha = headCommit.id

Среди них, если требуется авторизация, напишите в шапке:

"Authorization": `token ${TOKEN}`