向我的 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 4
accept() 调用成功但请求似乎没有通过,可能是握手问题?如上所述,运行在本地直接在容器中进行此操作可提供预期的结果,本地端口在 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
所以我正在用 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 4
accept() 调用成功但请求似乎没有通过,可能是握手问题?如上所述,运行在本地直接在容器中进行此操作可提供预期的结果,本地端口在 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