在github工作流程中运行带有超时的命令

时间:2020-08-28 22:57:19

标签: github-actions

我有一个类似于以下代码的GitHub操作。我有一个文件可以永久运行,但是在需要时会被用户打断。我尝试使用timeout,但是它不起作用,并给出了一些奇怪的消息。

一个小警告是,如果该过程超时,我希望这不会引发错误,以便该操作继续并报告成功。但是,如果python脚本本身失败了,我希望将其报告出来,因为将其运行一段时间以进行调试是在操作中运行它的目的。

name: Run file with interrupt then save results
on: 
  push:
    branches: 
      - master

jobs:
  build:
    strategy:
      matrix:
        python-version: [3.7]
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v1
        with:
          python-version: ${{ matrix.python-version }}
      - name: Install dependencies for ex 06
        run: |
          python -m pip install --upgrade pip
          cd /home/runner/work/repo_name/repo_name
          pip install -r requirements.txt
      - name: Run file with timeout
        run: |
          cd /home/runner/work/repo_name/repo_name/
          echo "hi1"
          timeout 5 sleep 10
          echo "hi2"
          python RunsForever.py
          echo "hi3"
      - name: Upload results
        uses: actions/upload-artifact@v2
        with:
          name: result
          path: /home/runner/work/repo_name/repo_name/output/

如何使超时正常工作?当前错误消息是:

Run cd /home/runner/work/repo_name/repo_name/
  cd /home/runner/work/repo_name/repo_name/
  echo "hi1"
  timeout 5 sleep 10
  echo "hi2"
  python RunsForever.py
  echo "hi3"
  shell: /bin/bash -e {0}
  env:
    pythonLocation: /opt/hostedtoolcache/Python/3.7.8/x64
hi1
##[error]Process completed with exit code 124.

我不明白可能是什么问题。我希望问题与超时函数隐藏RunsForever.py的输出有关,但实际上timeout本身似乎不起作用。我尝试使用apt-get安装,也无济于事。

是否有一些调试程序可以运行该调试程序?还有其他方法可以杀死进程,以便在预定时间后有效地中断它吗?

1 个答案:

答案 0 :(得分:1)

更新

我已根据评论更新了响应,以提供添加超时的正确方法,并且在超时时仍然成功,同时还支持正常故障。

基本上,我们检查错误代码124(超时)和0(成功),并确保我们不会在这些代码上退出。但是,如果我们收到任何其他信息,那么我们将退出以匹配github操作在失败时通常执行的操作

DEMO SUCCESS ON TIMEOUT

DEMO FAILURE ON ERROR

代码段

    - name: no timeout
      run: timeout 10 python ./RunsForever.py || code=$?; if [[ $code -ne 124 && $code -ne 0 ]]; then exit $code; fi
    
    - name: timeout # We add or so that return code is not none-zero which causes pipeline to fail
      run: timeout 1 python ./RunsForever.py || code=$?; if [[ $code -ne 124 && $code -ne 0 ]]; then exit $code; fi

上一个响应

仅处理超时,但不继续运行超时而不会报告失败。但是OP希望它也能在超时时成功,因此上面提供了更新。

您可以通过使用超时分钟来做到这一点。以您的代码为例

    - name: Run file with timeout
      timeout-minutes: 1 # Times out after 1 minute
      run: |
         cd /home/runner/work/repo_name/repo_name/
         echo "hi2"
         python RunsForever.py
         echo "hi3"

要为作业添加超时,请使用以下资源:https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idtimeout-minutes

要为单个步骤添加超时,请使用以下资源:https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idstepstimeout-minutes