diff --git a/.github/workflows/test-dev-image.yaml b/.github/workflows/test-dev-image.yaml new file mode 100644 index 00000000..1f2c0aaf --- /dev/null +++ b/.github/workflows/test-dev-image.yaml @@ -0,0 +1,108 @@ +name: Test Dev Image + +on: + workflow_run: + workflows: ["Build Dev Image"] + types: + - completed + branches: + - master + +jobs: + test-dev-image: + runs-on: ubuntu-latest + # Only run if the build workflow succeeded + if: ${{ github.event.workflow_run.conclusion == 'success' }} + + permissions: + contents: read + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Update Docker Compose to use master tag + working-directory: ./docker + run: | + # Replace 'latest' with 'master' tag for testing the dev image + sed -i 's/rockchin\/langbot:latest/rockchin\/langbot:master/g' docker-compose.yaml + echo "Updated docker-compose.yaml to use master tag:" + cat docker-compose.yaml + + - name: Start Docker Compose + working-directory: ./docker + run: docker compose up -d + + - name: Wait and Test API + run: | + # Function to test API endpoint + test_api() { + echo "Testing API endpoint..." + response=$(curl -s --connect-timeout 10 --max-time 30 -w "\n%{http_code}" http://localhost:5300/api/v1/system/info 2>&1) + curl_exit_code=$? + + if [ $curl_exit_code -ne 0 ]; then + echo "Curl failed with exit code: $curl_exit_code" + echo "Error: $response" + return 1 + fi + + http_code=$(echo "$response" | tail -n 1) + response_body=$(echo "$response" | head -n -1) + + if [ "$http_code" = "200" ]; then + echo "API is healthy! Response code: $http_code" + echo "Response: $response_body" + return 0 + else + echo "API returned non-200 response: $http_code" + echo "Response body: $response_body" + return 1 + fi + } + + # Wait 30 seconds before first attempt + echo "Waiting 30 seconds for services to start..." + sleep 30 + + # Try up to 3 times with 30-second intervals + max_attempts=3 + attempt=1 + + while [ $attempt -le $max_attempts ]; do + echo "Attempt $attempt of $max_attempts" + + if test_api; then + echo "Success! API is responding correctly." + exit 0 + fi + + if [ $attempt -lt $max_attempts ]; then + echo "Retrying in 30 seconds..." + sleep 30 + fi + + attempt=$((attempt + 1)) + done + + # All attempts failed + echo "Failed to get healthy response after $max_attempts attempts" + exit 1 + + - name: Show Container Logs on Failure + if: failure() + working-directory: ./docker + run: | + echo "=== Docker Compose Status ===" + docker compose ps + echo "" + echo "=== LangBot Logs ===" + docker compose logs langbot + echo "" + echo "=== Plugin Runtime Logs ===" + docker compose logs langbot_plugin_runtime + + - name: Cleanup + if: always() + working-directory: ./docker + run: docker compose down