在我的工作流程中,我定义了一个步骤:
- name: Setup Spring Boot App
run: |
cd backend/MeetApp
POSTGRES_USERNAME=postgres POSTGRES_PASSWORD=postgres nohup ./gradlew bootRun
无论我尝试什么,我都无法弄清楚如何启动我的 Spring Boot 过程,可能需要等待特定时间,然后转到下一步。
使用
&
在后台运行它
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
结束打印,顺序为:w1、开始、w2、w3、停止、w4。
就您而言,您需要:
- name: Setup Spring Boot App
run: |
cd backend/MeetApp
POSTGRES_USERNAME=postgres POSTGRES_PASSWORD=postgres nohup ./gradlew bootRun &
然后 - 我已经对此进行了测试 - 您可以将使用该后台进程的命令放在同一步骤或后续步骤中,无论哪种方式都可以工作。
现在,来自评论的更多详细信息,您需要等待足够长的时间才能开始在接下来的 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
如果 gradlew 已启动,则
<test-command>
应退出 0,否则为非零。通过这个循环,CI 在启动完成之前不会继续下一步。