向我的 http 服务器发送请求在 CI 环境中无限期挂起(CircleCI 和 github 操作)。在本地按预期工作

Sending a request to my http server hangs indefinitely in CI environment (CircleCI andgithub actions). Works as expected locally

所以我正在用 C++ 为学校编写一个基本的 http 服务器。目前我的服务可以接收请求并发送基本响应。我正在编写一个带有 python 请求的基本验收测试,并通过 运行 在后台运行网络服务器然后 运行 运行 [=36] 在 shell 脚本中执行它=] 客户。在本地(在 Mac 上)运行 测试它工作正常,也在自定义 ubuntu docker 容器上,它也用于我的 config.yml 文件。 但是当 运行 在 circleCI 上进行测试时,客户端似乎已被接受,但未收到 GET 请求,程序挂起。 有谁知道这是为什么以及如何解决? 请注意,包含代码仍在开发中,所以请善待:slight_smile:

我的config.yml:

version: 2

jobs:
  build:
    docker:
      - image: "rynosaurusrex/ci_for_codam:webserv"
    steps:
      - checkout
      - run:
          name: Build
          command: 'echo Building'
      - run:
          name: Unit-Test
          command: "make test && ./unit_test"
      - run:
          name: Acceptance-Test
          command: make acceptence

我的基本 python GET 请求:

import time
import requests
from requests import Session
from enum import Enum

class Colors:
    OKGREEN =   '3[92m'
    FAILRED =   '3[91m'
    NATURAL =   '3[0m'

OK              = 200
BAD_REQUEST     = 400
NOT_FOUND       = 404
URI_TOO_LONG    = 414
TEAPOT          = 418
NOT_IMPLEMENTED = 501

localhost = "http://localhost:80"
EXIT_CODE = 0

print("Connecting to server...")
r = requests.get(localhost)
print("Request send!")

if r.status_code != OK:
    print(f"{Colors.FAILRED}[KO] {Colors.NATURAL} Get request on http://localhost:80")
    EXIT_CODE = 1;
else:
    print(f"{Colors.OKGREEN}[OK] {Colors.NATURAL} Get request on http://localhost:80")

# sleep so that the exit code is that of the python script and not the server
time.sleep(1)
exit(EXIT_CODE)

和我凌乱的 bash 脚本到 运行 一切:

#!/bin/bash
# the & runs a command/program in the background
./Webserver.out &

# Save the PID to kill the webserv
PID=$!
# sleep for 2 second to make sure the server has time to start up
sleep 2

# run the tests
# curl localhost:80
python3 acceptence_tests/TestClient.py 
# save the return val of the tests for CI
T1=$?

kill $PID
exit $T1 

所以我在 运行 进行测试时打印了一些状态更新。打印时 Accepted client on fd 4accept() 调用成功但请求似乎没有通过,可能是握手问题?如上所述,运行在本地直接在容器中进行此操作可提供预期的结果,本地端口在 CircleCI 中如何工作?

我已经尝试将请求更改为端口 443 的 https,也是 0.0.0.0,似乎 handshake 没有任何想法?

提前致谢!

这可能是由于尝试 运行 作为容器中的 root 造成的,因为这可能是 blocked/limited 由主机系统(configured/owned 由 circleCI/github在这种情况下)出于安全原因。您可以尝试在 Dockerfile 中显式创建和使用单独的用户,避免奇怪的权限问题。

例如,如果将此添加到 Dockerfile,您将使用 test_user 而不是 root:

RUN useradd -m test_user
USER test_user