WedX - журнал о программировании и компьютерных науках

Запуск действия github после успешного выполнения travis CI

Я хочу каким-то образом запустить действие Github только для PR, если travis CI преуспеет. Я полагаю, что это можно экстраполировать на любой другой тип CI.

В настоящее время система работает так

1) submit PR
2) Travis CI & Action run at the same time

Но я хочу этот поток:

1) submit PR
2) Travis CI runs
  success: run Action
  failure: don't run Action

Я попытался реализовать run-travis-yml, который просто позволяет мне запускать скрипт сборки. для Travis CI перед следующим шагом в Акции; однако я предполагаю, что фактический CI является асинхронным, и поэтому он всегда будет успешным исключительно в зависимости от того, будет ли он строиться.

Как я могу запустить данное действие после успешной или неудачной отдельной проверки?

Кстати, этот код общедоступен


  • Пробовали ли вы отправить действие travis на github в качестве самого последнего шага сборки travis? (вызов конечной точки API; ref docs.github.com/en/ действия/ссылка/ документы. github.com/en/rest/reference/) 08.04.2021
  • да, это возможно, но не супер чисто. Кроме того, если я это сделаю, как мне сохранить тот же контекст github в триггере? 08.04.2021

Ответы:


1

Вот что сработало для меня:

https://api.github.com/repos/ethereum/EIPs/commits/<ref>/statuses по какой-то причине видит только статусы моих сторонних проверок CI. Таким образом, даже если другие тесты не пройдены, учитываются только тесты CI.

Поэтому я использовал это свойство, чтобы проверять его каждые 30 секунд, а затем прерывать работу в случае возникновения ошибки; вот код для этого:

// HACK (alita): check the CI status and only continue if the CI is successful
const checkCIStatus = async () => {
  const Github = getOctokit(GITHUB_TOKEN);
  const pr = await requirePr()
  const status = await Github.repos.getCombinedStatusForRef({
    owner: context.repo.owner,
    repo: context.repo.repo,
    ref: pr.head.ref
  }).then(res => res.data.state)

  console.log(`status is '${status}'...`)
  if (status === "failure") {
    setFailed("CI checks failed; bot can only merge if CI checks pass")
    throw "CI checks failed; bot can only merge if CI checks pass"
  }

  return status === "success";
}

export const pauseInterval = (checker, next, timeout) => async () => {
  const status = await checker();
  if (!status) {
    setTimeout(pauseInterval(checker, next, timeout), timeout);
  } else {
    return next()
  }
}

// only runs the bot if the CI statuses pass; checks every 30 seconds
export const main = pauseInterval(checkCIStatus, _main, CHECK_STATUS_INTERVAL)

выход из успеха

status is 'pending'...
status is 'pending'...
status is 'pending'...
status is 'pending'...
status is 'pending'...
status is 'pending'...
status is 'pending'...
status is 'pending'...
status is 'pending'...
status is 'pending'...
status is 'pending'...
status is 'success'...
<normal action outputs>

вывод из неудачных проверок

status is 'pending'...
status is 'pending'...
(node:1603) UnhandledPromiseRejectionWarning: CI checks failed; bot can only merge if CI checks pass
status is 'failure'...
(Use `node --trace-warnings ...` to show where the warning was created)
(node:1603) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:1603) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

В частности, это действительно возможно только в пользовательском действии, но вы, вероятно, могли бы создать простой файл действия/js, который мог бы выполнять такое же поведение и рассматриваться как действие перед данным действием. Если у вас это было, и это не удалось / удалось при успехе или ошибке, вы могли бы условно вызвать свое действие в скрипте Github yaml.

17.04.2021
Новые материалы

Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


Для любых предложений по сайту: [email protected]