nc and webcat to 127.0.0.1 #100
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# This is a GitHub workflow defining a set of jobs with a set of steps. | |
# ref: https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions | |
# | |
name: Test | |
on: | |
pull_request: | |
push: | |
branches-ignore: | |
- "dependabot/**" | |
- "pre-commit-ci-update-config" | |
tags: ["**"] | |
workflow_dispatch: | |
defaults: | |
run: | |
# GitHub Actions run without a TTY device. This is a workaround to have one, | |
# as required for our tests, based on | |
# https://github.com/actions/runner/issues/241#issuecomment-842566950. | |
shell: script --quiet --return --log-out /dev/null --command "bash -e {0}" | |
jobs: | |
container: | |
runs-on: ubuntu-22.04 | |
timeout-minutes: 10 | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- vncserver: tigervnc | |
vncserver_args: -localhost no --I-KNOW-THIS-IS-INSECURE | |
- vncserver: turbovnc | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Install test requirement (websocat) | |
run: | | |
wget -q https://github.com/vi/websocat/releases/download/v1.12.0/websocat.x86_64-unknown-linux-musl \ | |
-O /usr/local/bin/websocat | |
chmod +x /usr/local/bin/websocat | |
websocat --help=long | |
- name: Build image | |
run: | | |
docker build --progress=plain --build-arg vncserver=${{ matrix.vncserver }} -t test . | |
- name: (inside container) websockify --help | |
run: | | |
docker run test websockify --help | |
- name: (inside container) vncserver -help | |
run: | | |
# -help flag is not available for TurboVNC, but it emits the -help | |
# equivalent information anyhow if passed -help, but also errors. Due | |
# to this, we fallback to use the errorcode of vncsrever -list. | |
docker run test bash -c "vncserver -help || vncserver -list > /dev/null" | |
- name: Test vncserver | |
if: always() | |
run: | | |
container_id=$(docker run -d -it -p 127.0.0.1:5901:5901 test vncserver -xstartup /opt/install/jupyter_remote_desktop_proxy/share/xstartup -verbose -fg -geometry 1680x1050 -SecurityTypes None -rfbport 5901 ${{ matrix.vncserver_args }}) | |
sleep 1 | |
timeout --preserve-status 1 nc -v 127.0.0.1 5901 2>&1 | tee -a /dev/stderr | \ | |
grep --quiet RFB && echo "Passed test" || { echo "Failed test" && TEST_OK=false; } | |
echo "::group::vncserver logs" | |
docker exec $container_id bash -c 'cat ~/.vnc/*.log' | |
echo "::endgroup::" | |
docker stop $container_id > /dev/null | |
if [ "$TEST_OK" == "false" ]; then | |
echo "One or more tests failed!" | |
exit 1 | |
fi | |
- name: Test websockify'ed vncserver | |
if: always() | |
run: | | |
container_id=$(docker run -d -it -p 127.0.0.1:5901:5901 test websockify --verbose --log-file=/tmp/websockify.log --heartbeat=30 5901 -- vncserver -xstartup /opt/install/jupyter_remote_desktop_proxy/share/xstartup -verbose -fg -geometry 1680x1050 -SecurityTypes None -rfbport 5901 ${{ matrix.vncserver_args }}) | |
sleep 1 | |
websocat --binary --one-message --exit-on-eof "ws://127.0.0.1:5901/" 2>&1 | tee -a /dev/stderr | \ | |
grep --quiet RFB && echo "Passed test" || { echo "Failed test" && TEST_OK=false; } | |
echo "::group::websockify logs" | |
docker exec $container_id bash -c "cat /tmp/websockify.log" | |
echo "::endgroup::" | |
echo "::group::vncserver logs" | |
docker exec $container_id bash -c 'cat ~/.vnc/*.log' | |
echo "::endgroup::" | |
docker stop $container_id > /dev/null | |
if [ "$TEST_OK" == "false" ]; then | |
echo "One or more tests failed!" | |
exit 1 | |
fi | |
- name: Test project's proxy to websockify'ed vncserver | |
if: always() | |
run: | | |
container_id=$(docker run -d -it -p 127.0.0.1:8888:8888 -e JUPYTER_TOKEN=secret test) | |
sleep 3 | |
curl --silent --fail 'http://localhost:8888/desktop/?token=secret' | grep --quiet 'Jupyter Remote Desktop Proxy' && echo "Passed get index.html test" || { echo "Failed get index.html test" && TEST_OK=false; } | |
curl --silent --fail 'http://localhost:8888/desktop/static/dist/viewer.js?token=secret' > /dev/null && echo "Passed get viewer.js test" || { echo "Failed get viewer.js test" && TEST_OK=false; } | |
websocat --binary --one-message --exit-on-eof 'ws://localhost:8888/desktop-websockify/?token=secret' | \ | |
grep --quiet RFB && echo "Passed initial websocket test" || { \ | |
echo "Failed initial websocket test" && sleep 1 && websocat --binary --one-message --exit-on-eof 'ws://localhost:8888/desktop-websockify/?token=secret' | grep --quiet RFB && echo "Passed second websocket test" || { echo "Failed second websocket test" && TEST_OK=false; } \ | |
} | |
echo "::group::jupyter_server logs" | |
docker logs $container_id | |
echo "::endgroup::" | |
echo "::group::websockify logs" | |
docker exec $container_id bash -c "cat /tmp/websockify.log" | |
echo "::endgroup::" | |
echo "::group::vncserver logs" | |
docker exec $container_id bash -c 'cat ~/.vnc/*.log' | |
echo "::endgroup::" | |
timeout 5 docker stop $container_id > /dev/null && echo "Passed SIGTERM test" || { echo "Failed SIGTERM test" && TEST_OK=false; } | |
if [ "$TEST_OK" == "false" ]; then | |
echo "One or more tests failed!" | |
exit 1 | |
fi | |
# TODO: Check VNC desktop works, e.g. by comparing Playwright screenshots | |
# https://playwright.dev/docs/test-snapshots |