如何在后台 GH Actions 中运行 Spring Boot 服务器?

Kya*_*att 5 continuous-integration github spring-boot github-actions

在我的工作流程中,我定义了一个步骤:

    - name: Setup Spring Boot App
      run: |
         cd backend/MeetApp
         POSTGRES_USERNAME=postgres POSTGRES_PASSWORD=postgres nohup ./gradlew bootRun
Run Code Online (Sandbox Code Playgroud)

无论我尝试什么,我都无法弄清楚如何启动我的 Spring Boot 过程,可能需要等待特定时间,然后转到下一步。

joa*_*nis 7

长话短说

在后台运行它&

细节

GitHub Actions 允许您在后台运行命令,并&在行末尾添加 。

例如,这个虚拟步骤:

  - name: does background work?
    run: |
      echo start && sleep 3 && echo stop &
      echo w1 && sleep 1 && echo w2 && sleep 1 && echo w3 && sleep 1 && echo w4
Run Code Online (Sandbox Code Playgroud)

最终打印,顺序为:w1、开始、w2、w3、停止、w4。

就您而言,您需要:

  - name: Setup Spring Boot App
    run: |
      cd backend/MeetApp
      POSTGRES_USERNAME=postgres POSTGRES_PASSWORD=postgres nohup ./gradlew bootRun &
Run Code Online (Sandbox Code Playgroud)

然后 - 我已经对此进行了测试 - 您可以将使用该后台进程的命令放在同一步骤或后续步骤中,无论哪种方式它都可以工作。

等待它

现在,来自评论的更多详细信息,您需要等待足够长的时间才能开始在接下来的 CI 步骤中使用此后台进程。一个简单的sleep 5(或选择你的时间)可以工作,但是如果你有一个虚拟查询,只有在后台进程启动后才会成功,那么每秒循环执行一次直到最大延迟将a)等待必要的最短时间和b) 确保您始终等待足够长的时间。

以下是最多等待 20 秒的示例:

  - name: Setup Spring Boot App
    run: |
      cd backend/MeetApp
      POSTGRES_USERNAME=postgres POSTGRES_PASSWORD=postgres nohup ./gradlew bootRun &
      for attempt in {1..20}; do sleep 1; if <test-command>; then echo ready; break; fi; echo waiting...; done 
Run Code Online (Sandbox Code Playgroud)

如果 gradlew 已启动,则应<test-command>退出 0,否则应退出非零。通过此循环,CI 在启动完成之前不会继续执行下一步。

  • 我尝试在行尾添加 &amp; ,但根据 Github Actions 提供的日志判断,它不会启动服务器。此任务中记录的最后一行是“启动 Gradle 守护进程(后续构建会更快)”,然后切换到后续步骤。我不确定它是否在后台运行和启动,但只是不记录。 (2认同)