Как получить идентификатор установки приложения github при событии запроса на вытягивание?
Я создаю конвейер сборки с Github, который будет создавать контрольный прогон для каждого запроса на вытягивание для анализа производительности моего приложения. Я создал и установил приложение Github в свое репо и сгенерировал закрытый ключ. Мне нужно выполнитьAuthenticating as an installation
чтобы получить токен доступа.
Но в соответствии с документами, чтобы получить токен доступа для установки, сначала мне нужно получить список установок этого приложения и найти конкретную установку из этого списка. Но я не знаю, как определить конкретный installation_id приложения для события запроса на вытягивание, возникающего в конкретном репозитории, в котором установлено мое приложение.
Я не знаю, что мне не хватает.
3 ответа
Если ваш CI/CD не работает с веб-перехватчиками GitHub (например, из-за брандмауэра), вы можете сделать что-то вроде этого:
#!/bin/bash
HEADER=$( echo -n {\"alg\":\"RS256\"} | base64 | tr -d '=' )
PAYLOAD=$( echo -n \{\"iat\":$(date -u '+%s'),\"exp\":$(( $( date -u '+%s' ) + 600 )),\"iss\":$GITHUB_APP_ID\} | base64 | tr -d '\n' | tr -d '=' | tr / _ | tr + - )
SIGNATURE=$( echo -n "$HEADER.$PAYLOAD" | openssl dgst -sha256 -sign ./private_key -binary | openssl base64 | tr -d '\n' | tr -d '=' | tr / _ | tr + - )
TOKEN=$HEADER.$PAYLOAD.$SIGNATURE
INSTALLATION_ID=$( curl -s -H "Authorization: Bearer $TOKEN" -H "Accept: application/vnd.github.antiope-preview+json" -H "Accept: application/vnd.github.machine-man-preview+json" https://api.github.com/app/installations | jq .[0].id )
INSTALLATION_TOKEN=$( curl -s -H "Authorization: Bearer $TOKEN" -H "Accept: application/vnd.github.antiope-preview+json" -H "Accept: application/vnd.github.machine-man-preview+json" -d '{"permissions":{ "checks":"write"}}' https://api.github.com/app/installations/$INSTALLATION_ID/access_tokens | jq .token | tr -d '"' )
echo $INSTALLATION_TOKEN
Или в Python:
# https://gist.github.com/pelson/47c0c89a3522ed8da5cc305afc2562b0
import json
import os
import time
import jwt
import requests
from cryptography.hazmat.backends import default_backend
github_app_id = os.environ['GITHUB_APP_ID']
time_since_epoch_in_seconds = int(time.time())
cert_bytes = open("private_key", 'r').read().encode()
private_key = default_backend().load_pem_private_key(cert_bytes, None)
payload = {
# issued at time
'iat': time_since_epoch_in_seconds,
# JWT expiration time (10 minute maximum)
'exp': time_since_epoch_in_seconds + (10 * 60),
# GitHub App's identifier
'iss': github_app_id
}
jwt = jwt.encode(payload, private_key, algorithm='RS256')
headers = {"Authorization": "Bearer {}".format(jwt.decode()),
"Accept": "application/vnd.github.machine-man-preview+json",
"Accept": "application/vnd.github.antiope-preview+json"}
resp = requests.get(
'https://api.github.com/app/installations', headers=headers)
installation_id = json.loads(resp.content.decode())[0]['id']
data = '{"permissions":{ "checks":"write"}}'
resp = requests.post(
'https://api.github.com/app/installations/' + str(installation_id) + '/access_tokens', headers=headers, data=data)
installation_token = json.loads(resp.content.decode())['token']
print(installation_token)
Мне потребовалось время, но этот код работает. Тебе нужно иметьGITHUB_APP_ID
и файл private_key
содержащий закрытый ключ, созданный GitHub.
Затем вы можете редактировать прогоны проверки следующим образом:
curl -s -H "Authorization: token $GITHUB_APP_INSTALLATION_TOKEN" -H "Accept: application/vnd.github.antiope-preview+json" -H "Accept: application/vnd.github.machine-man-preview+json" -d @body.json https://api.github.com/repos/cloud-pi/$GITHUB_REPO/check-runs
где body.json
представляет собой файл JSON, содержащий следующие данные: https://developer.github.com/v3/checks/runs/
На сайте Github после установки приложения перейдите по ссылке:
- Настройки
- Настройки разработчика
- Приложения на гитхабе
- Нажмите «Изменить» рядом с приложением.
- Дополнительно на левой боковой панели
- Нажмите на уведомление, чтобы
installation.created
Там вы найдетеinstallation.id
в теле ответа.
По сути, чтобы не зависеть от кода, вы можете вызвать метод https://api.github.com/app/installations API, чтобы получить последнюю версию. Но вы должны быть уверены, что последний - тот, который вам нужен, или что вы получили правильного пользователя / организацию, чтобы вы могли искать в своих результатах нужного. В противном случае вам нужно будет использовать веб-перехватчик (https://developer.github.com/apps/quickstart-guides/setting-up-your-development-environment/#authenticating-as-an-installation).