Create separate test workflow for docker

This expands on the current testing suite a bit by introducing a new
workflow for testing functionality within the docker container. It runs
the same test suite as the regular "test" workflow, but also performs a
health check after running the app for 10 seconds to ensure
functionality.

The buildx workflow now waits for the docker test script to finish
successfully, rather than the regular test workflow. This will hopefully
avoid situations where new images are pushed with issues that aren't
detected in regular testing of the app.
このコミットが含まれているのは:
Ben Busby 2021-11-22 00:26:25 -07:00
コミット 5a27d748d1
この署名に対応する既知のキーがデータベースに存在しません
GPGキーID: 339B7B7EB5333D14
3個のファイルの変更28行の追加10行の削除

ファイルの表示

@ -2,7 +2,7 @@ name: buildx
on: on:
workflow_run: workflow_run:
workflows: ["tests"] workflows: ["docker_tests"]
branches: [main] branches: [main]
types: types:
- completed - completed

19
.github/workflows/docker_tests.yml vendored ノーマルファイル
ファイルの表示

@ -0,0 +1,19 @@
name: docker_tests
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: checkout code
uses: actions/checkout@v2
- name: build and test
run: |
docker build --tag whoogle-search:test .
TEST_CONTAINER=$(docker run --entrypoint=/bin/bash --detach whoogle-search:test)
docker cp test "$TEST_CONTAINER":/whoogle/test
docker exec "$TEST_CONTAINER" ./run test
docker exec --detach "$TEST_CONTAINER" ./run
sleep 10
docker exec "$TEST_CONTAINER" curl -f http://localhost:5000/healthz || exit 1

ファイルの表示

@ -28,7 +28,6 @@ from requests.models import PreparedRequest
# Load DDG bang json files only on init # Load DDG bang json files only on init
bang_json = json.load(open(app.config['BANG_FILE'])) bang_json = json.load(open(app.config['BANG_FILE']))
# Check the newest version of WHOOGLE # Check the newest version of WHOOGLE
update = bsoup(get(app.config['RELEASES_URL']).text, 'html.parser') update = bsoup(get(app.config['RELEASES_URL']).text, 'html.parser')
newest_version = update.select_one('[class="Link--primary"]').string[1:] newest_version = update.select_one('[class="Link--primary"]').string[1:]
@ -36,7 +35,7 @@ current_version = int(''.join(filter(str.isdigit,
app.config['VERSION_NUMBER']))) app.config['VERSION_NUMBER'])))
newest_version = int(''.join(filter(str.isdigit, newest_version))) newest_version = int(''.join(filter(str.isdigit, newest_version)))
newest_version = '' if current_version >= newest_version \ newest_version = '' if current_version >= newest_version \
else newest_version else newest_version
def auth_required(f): def auth_required(f):
@ -113,10 +112,10 @@ def before_request_func():
session['uuid'] = str(uuid.uuid4()) session['uuid'] = str(uuid.uuid4())
session['key'] = generate_user_key() session['key'] = generate_user_key()
# Skip checking for session on /autocomplete searches, # Skip checking for session on any searches that don't
# since they can be done from the browser search bar (aka # require a valid session
# no ability to initialize a session) if (not Endpoint.autocomplete.in_path(request.path) and
if not Endpoint.autocomplete.in_path(request.path): not Endpoint.healthz.in_path(request.path)):
return redirect(url_for( return redirect(url_for(
'session_check', 'session_check',
session_id=session['uuid'], session_id=session['uuid'],
@ -199,9 +198,9 @@ def index():
'logo.html', 'logo.html',
dark=g.user_config.dark), dark=g.user_config.dark),
config_disabled=( config_disabled=(
app.config['CONFIG_DISABLE'] or app.config['CONFIG_DISABLE'] or
not valid_user_session(session) or not valid_user_session(session) or
'cookies_disabled' in request.args), 'cookies_disabled' in request.args),
config=g.user_config, config=g.user_config,
tor_available=int(os.environ.get('TOR_AVAILABLE')), tor_available=int(os.environ.get('TOR_AVAILABLE')),
version_number=app.config['VERSION_NUMBER']) version_number=app.config['VERSION_NUMBER'])