如何在 GitHub Action 中等待容器健康?

sfs*_*797 7 continuous-integration docker github-actions

我正在使用 GitHub Action 进行一些自动化测试,我的应用程序是在 docker 中开发的。

name: Docker Image CI

on:
  push:
    branches: [ master]
  pull_request:
    branches: [ master]

jobs:

  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - name: Build the Docker image
      run: docker-compose build

    - name: up mysql and apache container runs
      run: docker-compose up -d 

    - name: install dependencies
      run: docker exec  myapp php composer.phar install
  
    - name: show running container
      run: docker ps 


    - name: run unit test
      run: docker exec  myapp ./vendor/bin/phpunit 
Run Code Online (Sandbox Code Playgroud)

在“显示正在运行的容器”步骤中,我可以看到所有容器都在运行,但对于 MySQL,状态为(运行状况:正在启动)。因此,我的单元测试用例全部失败,因为它需要连接到 MySQL。请问有没有办法只有当MySQL容器状态健康时才启动单元案例?

小智 6

您可以使用此处--wait记录的选项等待所有服务正常运行。

命令示例:docker compose up --detach --wait --wait-timeout 30

仅当所有服务都运行后,或者定义的运行状况检查正常时,该命令才会返回。

  • 使用适用于 Ubuntu 22.x 和 20.x 的 GH 运行程序时,我遇到了“docker-compose up --wait”无法正常工作的问题。不支持“--wait”标志。为了拯救那些发现自己处于相同答案中的人,@skowalak 准确地使用了“docker compose up .. --wait”。GH 运行器上的 docker-compose cli 看起来有点旧,没有这个标志,而 docker cli 有。 (4认同)

sfs*_*797 1

我想提供一种解决方案,不是一个聪明的解决方案,但它需要最少的配置并且可以立即使用,只需使用 GitHub Action for Sleeping 即可。

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
    - name: Sleep for 30 seconds
      uses: jakejarvis/wait-action@master
      with:
        time: '30s'
Run Code Online (Sandbox Code Playgroud)

假设:你的Mysql服务器将在30秒内启动并运行。

  • 使用一个动作是不是太过分了,因为你可以只使用“run: sleep 30” (3认同)