Вызовы API GitHub моего действия GitHub начинают завершаться сбоем через определенный промежуток времени

#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-адрес теперь корректен, и вызовы запросов работают.