#github-actions
#github-действия
Вопрос:
Вчера я успешно запустил это действие GitHub несколько раз, но теперь оно завершается ошибкой HTTP Not Found. Если я выполню тот же вызов REST для URL-адреса в Postman https://api.github.com/repos/RobotOpsPlayground/scottTest5/issues/4 Я получаю обратно ожидаемые результаты JSON. Я не понимаю, что изменилось, у кого-нибудь есть идея?
До сих пор я воссоздал и использую новый личный токен GitHub, который имеет те же разрешения, что и тот, который работал. Я скопировал код в новое хранилище и столкнулся с той же проблемой.
Это результат выполнения действия:
Run ./.github/actions/route_issue/
with:
myToken: ***
myOwner: RobotOpsPlayground
myRepo: RobotOpsPlayground/scottTest5
myKnownLabels: repo-request, team-request, member-request, triage
myDefaultLabel: triage
myIssueNumber: 0
issueNumber 4
owner RobotOpsPlayground
repo RobotOpsPlayground/scottTest5
token ***
getting /repos/RobotOpsPlayground/scottTest5/issues/4 details from github
"GET /repos/RobotOpsPlayground/scottTest5/issues/4
sync function called for /repos/:repo/issues/:issueNumber
failing due to HttpError: Not Found -- Not Found
Error: Not Found
И вот action.yaml
name: 'route_issue'
description: 'pull some info from an issue'
inputs:
myToken:
description: 'github token'
required: true
myOwner:
description: 'github owner|organization'
required: true
default: 'RobotOpsPlayground'
myRepo:
description: 'github repo'
required: true
И часть действий index.js
async function run() {
const myToken = core.getInput('myToken');
const myOwner = core.getInput('myOwner');
const myRepo = core.getInput('myRepo');
const myIssueNumber = github.context.issue.number;
// get issue details by looking up its issue number
console.log(`getting /repos/${myRepo}/issues/${myIssueNumber} details from github `);
let req = {
method: 'GET',
url: '/repos/:repo/issues/:issueNumber',
headers: { authorization: `token ${myToken}` },
repo: myRepo,
issueNumber: myIssueNumber,
log: "debug"
};
const result = await request req
console.log("past getting issue")
issue = result['data'];
console.log(`my issue ${issue}`)
if (issue.state !== 'open') {
console.log("issue was not open")
} else {
console.log("processing issue");
}
}
И рабочий процесс GitHub
name: route_issue
on:
issues:
types: [opened]
jobs:
route_issue:
runs-on: self-hosted
outputs:
issueNumber: ${{ steps.route_issue.outputs.issueNumber }}
requestType: ${{ steps.route_issue.outputs.requestType }}
steps:
- id: checkout
uses: actions/checkout@v2
- id: route_issue
uses: ./.github/actions/route_issue/
with:
myToken: ${{ secrets.GH_TOKEN3 }}
myOwner: ${{ github.repository_owner }}
myRepo: ${{ github.repository }}
Ответ №1:
Исправлено из-за моей ошибки
Блок кода
let req = {
method: 'GET',
url: '/repos/:repo/issues/:issueNumber',
headers: { authorization: `token ${myToken}` },
repo: myRepo,
issueNumber: myIssueNumber,
log: "debug"
};
произошла ошибка, из-за которой я не уверен, почему она работала раньше, но в любом случае проблема заключалась в том, что myRepo
переменная содержала значение my-organization/my-reponame
. Когда структура запроса была передана в request
вызов
const result = await request(req)
@octokit/request
библиотека, которую я использую, кодировала параметр :repo как be my-organization@2FA/my-reponame
, заменяя ‘/’ на @2FA . Эта замена символов сделала сгенерированный URL-адрес недействительным.
Исправление состояло в том, чтобы разделить переменную myRepo на ‘/’ и передать обе части в библиотеку запросов.
let org_repo = myRepo.split('/')
let req = {
method: 'GET',
url: '/repos/:org/:repo/issues/:issueNumber',
headers: { authorization: `token ${myToken}` },
org: org_repo[0],
repo: org_repo[1],
issueNumber: myIssueNumber,
log: "debug"
};
Сгенерированный URL-адрес теперь корректен, и вызовы запросов работают.