Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SecureDrop 1.8.0 #5862

Merged
merged 1 commit into from
Mar 11, 2021
Merged

SecureDrop 1.8.0 #5862

merged 1 commit into from
Mar 11, 2021

Conversation

zenmonkeykstop
Copy link
Contributor

@zenmonkeykstop zenmonkeykstop commented Mar 11, 2021

Status

Ready for review

Description of Changes

Towards #5794

Testing

  • Changelog is accurate
  • Version updated successfully
  • Target branch is release/1.8.0

Copy link
Contributor

@emkll emkll left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚀

@zenmonkeykstop
Copy link
Contributor Author

zenmonkeykstop commented Mar 11, 2021

Seeing 2 errors locally in admin tests (probably same in CI):

user@sd-dev:~/securedrop$ git checkout 1.8.0
Note: checking out '1.8.0'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 70b9de460 SecureDrop 1.8.0
user@sd-dev:~/securedrop$ make -C admin test 
make: Entering directory '/home/user/securedrop/admin'
bin/dev-shell tox
pylint create: /sd-root/admin/.tox/pylint
pylint installdeps: -r/sd-root/admin/requirements.txt, -r/sd-root/admin/requirements-dev.txt
pylint develop-inst: /sd-root/admin
pylint installed: ansible==2.9.7,astroid==2.4.2,certifi==2018.4.16,cffi==1.11.4,chardet==3.0.4,click==7.1.2,coverage==4.4.2,cryptography==3.2.1,d2to1==0.2.12.post1,flake8==3.5.0,flaky==3.4.0,idna==2.6,isort==4.2.15,Jinja2==2.11.3,lazy-object-proxy==1.4.3,MarkupSafe==1.1.1,mccabe==0.6.1,mock==2.0.0,netaddr==0.7.19,pbr==3.1.1,pexpect==4.5.0,pip-tools==4.5.1,pluggy==0.6.0,prompt-toolkit==2.0.9,ptyprocess==0.5.2,py==1.9.0,pycodestyle==2.3.1,pycparser==2.18,pyflakes==1.6.0,pylint==2.5.0,pytest==3.2.0,pytest-catchlog==1.2.2,PyYAML==5.3.1,requests==2.22.0,-e [email protected]:zenmonkeykstop/securedrop.git@70b9de4607eefcc0fb0573c86a6dab12ca92864e#egg=securedrop_admin&subdirectory=admin,six==1.15.0,toml==0.10.1,tox==2.9.1,typed-ast==1.4.1,urllib3==1.25.10,virtualenv==15.1.0,wcwidth==0.1.7,wrapt==1.12.1
pylint runtests: PYTHONHASHSEED='1142683218'
pylint runtests: commands[0] | pylint --reports=no --errors-only bootstrap.py securedrop_admin
flake8 create: /sd-root/admin/.tox/flake8
flake8 installdeps: -r/sd-root/admin/requirements.txt, -r/sd-root/admin/requirements-dev.txt
flake8 develop-inst: /sd-root/admin
flake8 installed: ansible==2.9.7,astroid==2.4.2,certifi==2018.4.16,cffi==1.11.4,chardet==3.0.4,click==7.1.2,coverage==4.4.2,cryptography==3.2.1,d2to1==0.2.12.post1,flake8==3.5.0,flaky==3.4.0,idna==2.6,isort==4.2.15,Jinja2==2.11.3,lazy-object-proxy==1.4.3,MarkupSafe==1.1.1,mccabe==0.6.1,mock==2.0.0,netaddr==0.7.19,pbr==3.1.1,pexpect==4.5.0,pip-tools==4.5.1,pluggy==0.6.0,prompt-toolkit==2.0.9,ptyprocess==0.5.2,py==1.9.0,pycodestyle==2.3.1,pycparser==2.18,pyflakes==1.6.0,pylint==2.5.0,pytest==3.2.0,pytest-catchlog==1.2.2,PyYAML==5.3.1,requests==2.22.0,-e [email protected]:zenmonkeykstop/securedrop.git@70b9de4607eefcc0fb0573c86a6dab12ca92864e#egg=securedrop_admin&subdirectory=admin,six==1.15.0,toml==0.10.1,tox==2.9.1,typed-ast==1.4.1,urllib3==1.25.10,virtualenv==15.1.0,wcwidth==0.1.7,wrapt==1.12.1
flake8 runtests: PYTHONHASHSEED='1142683218'
flake8 runtests: commands[0] | flake8 bin securedrop_admin bootstrap.py tests
/sd-root/admin/.tox/flake8/lib/python3.7/site-packages/pycodestyle.py:113: FutureWarning: Possible nested set at position 1
  EXTRANEOUS_WHITESPACE_REGEX = re.compile(r'[[({] | []}),;:]')
py3 create: /sd-root/admin/.tox/py3
py3 installdeps: -r/sd-root/admin/requirements.txt, -r/sd-root/admin/requirements-dev.txt
py3 develop-inst: /sd-root/admin
py3 installed: ansible==2.9.7,astroid==2.4.2,certifi==2018.4.16,cffi==1.11.4,chardet==3.0.4,click==7.1.2,coverage==4.4.2,cryptography==3.2.1,d2to1==0.2.12.post1,flake8==3.5.0,flaky==3.4.0,idna==2.6,isort==4.2.15,Jinja2==2.11.3,lazy-object-proxy==1.4.3,MarkupSafe==1.1.1,mccabe==0.6.1,mock==2.0.0,netaddr==0.7.19,pbr==3.1.1,pexpect==4.5.0,pip-tools==4.5.1,pluggy==0.6.0,prompt-toolkit==2.0.9,ptyprocess==0.5.2,py==1.9.0,pycodestyle==2.3.1,pycparser==2.18,pyflakes==1.6.0,pylint==2.5.0,pytest==3.2.0,pytest-catchlog==1.2.2,PyYAML==5.3.1,requests==2.22.0,-e [email protected]:zenmonkeykstop/securedrop.git@70b9de4607eefcc0fb0573c86a6dab12ca92864e#egg=securedrop_admin&subdirectory=admin,six==1.15.0,toml==0.10.1,tox==2.9.1,typed-ast==1.4.1,urllib3==1.25.10,virtualenv==15.1.0,wcwidth==0.1.7,wrapt==1.12.1
py3 runtests: PYTHONHASHSEED='1142683218'
py3 runtests: commands[0] | env /sd-root/admin/.tox/py3/bin/coverage run --source=securedrop_admin,bootstrap /sd-root/admin/.tox/py3/bin/pytest -v tests
============================================================================================== test session starts ===============================================================================================
platform linux -- Python 3.7.3, pytest-3.2.0, py-1.9.0, pluggy-0.4.0 -- /sd-root/admin/.tox/py3/bin/python3
cachedir: .cache
rootdir: /sd-root/admin, inifile:
plugins: catchlog-1.2.2, flaky-3.4.0
collected 82 items 

tests/test_integration.py::test_install_with_no_config PASSED
tests/test_integration.py::test_sdconfig_on_first_run PASSED
tests/test_integration.py::test_sdconfig_both_v2_v3_true PASSED
tests/test_integration.py::test_sdconfig_only_v2_true PASSED
tests/test_integration.py::test_sdconfig_enable_journalist_alerts PASSED
tests/test_integration.py::test_sdconfig_enable_https_on_source_interface PASSED
tests/test_integration.py::test_check_for_update_when_updates_needed PASSED
tests/test_integration.py::test_check_for_update_when_updates_not_needed FAILED
tests/test_integration.py::test_update PASSED
tests/test_integration.py::test_update_fails_when_no_signature_present PASSED
tests/test_integration.py::test_update_with_duplicate_branch_and_tag FAILED
tests/test_securedrop-admin-setup.py::TestSecureDropAdmin::test_verbose PASSED
tests/test_securedrop-admin-setup.py::TestSecureDropAdmin::test_not_verbose PASSED
tests/test_securedrop-admin-setup.py::TestSecureDropAdmin::test_run_command PASSED
tests/test_securedrop-admin-setup.py::TestSecureDropAdmin::test_install_pip_dependencies_up_to_date PASSED
tests/test_securedrop-admin-setup.py::TestSecureDropAdmin::test_install_pip_dependencies_upgraded PASSED
tests/test_securedrop-admin-setup.py::TestSecureDropAdmin::test_install_pip_dependencies_fail PASSED
tests/test_securedrop-admin-setup.py::TestSecureDropAdmin::test_python3_stretch_venv_deleted_in_buster PASSED
tests/test_securedrop-admin-setup.py::TestSecureDropAdmin::test_python3_buster_venv_not_deleted_in_buster PASSED
tests/test_securedrop-admin-setup.py::TestSecureDropAdmin::test_python3_stretch_venv_not_deleted_in_stretch PASSED
tests/test_securedrop-admin-setup.py::TestSecureDropAdmin::test_venv_cleanup_subprocess_exception PASSED
tests/test_securedrop-admin-setup.py::TestSecureDropAdmin::test_envsetup_cleanup PASSED
tests/test_securedrop-admin.py::TestSecureDropAdmin::test_verbose PASSED
tests/test_securedrop-admin.py::TestSecureDropAdmin::test_not_verbose PASSED
tests/test_securedrop-admin.py::TestSecureDropAdmin::test_update_check_decorator_when_no_update_needed PASSED
tests/test_securedrop-admin.py::TestSecureDropAdmin::test_update_check_decorator_when_update_needed PASSED
tests/test_securedrop-admin.py::TestSecureDropAdmin::test_update_check_decorator_when_skipped PASSED
tests/test_securedrop-admin.py::TestSecureDropAdmin::test_check_for_updates_update_needed PASSED
tests/test_securedrop-admin.py::TestSecureDropAdmin::test_check_for_updates_higher_version PASSED
tests/test_securedrop-admin.py::TestSecureDropAdmin::test_check_for_updates_ensure_newline_stripped PASSED
tests/test_securedrop-admin.py::TestSecureDropAdmin::test_check_for_updates_update_not_needed PASSED
tests/test_securedrop-admin.py::TestSecureDropAdmin::test_check_for_updates_if_most_recent_tag_is_rc PASSED
tests/test_securedrop-admin.py::TestSecureDropAdmin::test_get_git_branch[* develop\n-develop] PASSED
tests/test_securedrop-admin.py::TestSecureDropAdmin::test_get_git_branch[ develop\n* release/1.7.0\n-release/1.7.0] PASSED
tests/test_securedrop-admin.py::TestSecureDropAdmin::test_get_git_branch[* (HEAD detached at 1.7.0)\n  develop\n  release/1.7.0\n-(HEAD detached at 1.7.0)] PASSED
tests/test_securedrop-admin.py::TestSecureDropAdmin::test_get_git_branch[  main\n* valid_+!@#$%&_branch_name\n-valid_+!@#$%&_branch_name] PASSED
tests/test_securedrop-admin.py::TestSecureDropAdmin::test_get_git_branch[Unrecognized output.-None] PASSED
tests/test_securedrop-admin.py::TestSecureDropAdmin::test_update_exits_if_not_needed PASSED
tests/test_securedrop-admin.py::TestSecureDropAdmin::test_get_release_key_from_valid_keyserver PASSED
tests/test_securedrop-admin.py::TestSecureDropAdmin::test_update_signature_verifies[gpg: Signature made Tue 13 Mar 2018 01:14:11 AM UTC\ngpg:                using RSA key 22245C81E3BAEB4138B36061310F561200F4AD77\ngpg: Good signature from "SecureDrop Release Signing Key" [unknown]\n] PASSED
tests/test_securedrop-admin.py::TestSecureDropAdmin::test_update_signature_verifies[gpg: Signature made Thu 20 Jul 2017 08:12:25 PM EDT\ngpg:                using RSA key 22245C81E3BAEB4138B36061310F561200F4AD77\ngpg: Good signature from "SecureDrop Release Signing Key <[email protected]>"\n] PASSED
tests/test_securedrop-admin.py::TestSecureDropAdmin::test_update_signature_verifies[gpg: Signature made Thu 20 Jul 2017 08:12:25 PM EDT\ngpg:                using RSA key 22245C81E3BAEB4138B36061310F561200F4AD77\ngpg: Good signature from "SecureDrop Release Signing Key" [unknown]\ngpg:                 aka "SecureDrop Release Signing Key <[email protected]>" [unknown]\n] PASSED
tests/test_securedrop-admin.py::TestSecureDropAdmin::test_update_unexpected_exception_git_refs PASSED
tests/test_securedrop-admin.py::TestSecureDropAdmin::test_update_signature_does_not_verify PASSED
tests/test_securedrop-admin.py::TestSecureDropAdmin::test_update_malicious_key_named_fingerprint PASSED
tests/test_securedrop-admin.py::TestSecureDropAdmin::test_update_malicious_key_named_good_sig PASSED
tests/test_securedrop-admin.py::TestSecureDropAdmin::test_update_malicious_key_named_good_sig_fingerprint PASSED
tests/test_securedrop-admin.py::TestSecureDropAdmin::test_no_signature_on_update PASSED
tests/test_securedrop-admin.py::TestSecureDropAdmin::test_exit_codes PASSED
tests/test_securedrop-admin.py::TestSiteConfig::test_exists PASSED
tests/test_securedrop-admin.py::TestSiteConfig::test_validate_not_empty PASSED
tests/test_securedrop-admin.py::TestSiteConfig::test_validate_time PASSED
tests/test_securedrop-admin.py::TestSiteConfig::test_validate_ossec_username PASSED
tests/test_securedrop-admin.py::TestSiteConfig::test_validate_ossec_password PASSED
tests/test_securedrop-admin.py::TestSiteConfig::test_validate_email PASSED
tests/test_securedrop-admin.py::TestSiteConfig::test_validate_ossec_email PASSED
tests/test_securedrop-admin.py::TestSiteConfig::test_validate_optional_email PASSED
tests/test_securedrop-admin.py::TestSiteConfig::test_validate_user PASSED
tests/test_securedrop-admin.py::TestSiteConfig::test_validate_ip PASSED
tests/test_securedrop-admin.py::TestSiteConfig::test_validate_path PASSED
tests/test_securedrop-admin.py::TestSiteConfig::test_validate_optional_path PASSED
tests/test_securedrop-admin.py::TestSiteConfig::test_validate_yes_no PASSED
tests/test_securedrop-admin.py::TestSiteConfig::test_validate_fingerprint PASSED
tests/test_securedrop-admin.py::TestSiteConfig::test_validate_optional_fingerprint PASSED
tests/test_securedrop-admin.py::TestSiteConfig::test_sanitize_fingerprint PASSED
tests/test_securedrop-admin.py::TestSiteConfig::test_validate_int PASSED
tests/test_securedrop-admin.py::TestSiteConfig::test_locales PASSED
tests/test_securedrop-admin.py::TestSiteConfig::test_validate_locales PASSED
tests/test_securedrop-admin.py::TestSiteConfig::test_save PASSED
tests/test_securedrop-admin.py::TestSiteConfig::test_validate_gpg_key PASSED
tests/test_securedrop-admin.py::TestSiteConfig::test_journalist_alert_email PASSED
tests/test_securedrop-admin.py::TestSiteConfig::test_update_config PASSED
tests/test_securedrop-admin.py::TestSiteConfig::test_update_config_no_site_specific PASSED
tests/test_securedrop-admin.py::TestSiteConfig::test_load_and_update_config PASSED
tests/test_securedrop-admin.py::TestSiteConfig::test_desc_conditional PASSED
tests/test_securedrop-admin.py::TestSiteConfig::test_user_prompt_config_one PASSED
tests/test_securedrop-admin.py::TestSiteConfig::test_validated_input PASSED
tests/test_securedrop-admin.py::TestSiteConfig::test_load PASSED
tests/test_securedrop-admin.py::test_generate_new_v3_keys PASSED
tests/test_securedrop-admin.py::test_find_or_generate_new_torv3_keys_first_run PASSED
tests/test_securedrop-admin.py::test_find_or_generate_new_torv3_keys_subsequent_run PASSED
tests/test_securedrop-admin.py::test_v3_and_https_cert_message PASSED
===Flaky Test Report===

test_check_for_update_when_updates_needed passed 1 out of the required 1 times. Success!
test_check_for_update_when_updates_not_needed failed (2 runs remaining out of 3).
	<class 'pexpect.exceptions.EOF'>
	End Of File (EOF). Exception style platform.
<pexpect.pty_spawn.spawn object at 0x7f4babb757f0>
command: /sd-root/admin/.tox/py3/bin/coverage
args: ['/sd-root/admin/.tox/py3/bin/coverage', 'run', '/sd-root/admin/securedrop_admin/__init__.py', '--root', '/tmp/pytest-of-user/pytest-0/test_check_for_update_when_upd1/securedrop/install_files/ansible-base', 'check_for_updates']
buffer (last 100 chars): b''
before (last 100 chars): b'INFO: Checking for SecureDrop updates...\r\nFetching origin\r\nINFO: Update needed\r\n'
after: <class 'pexpect.exceptions.EOF'>
match: None
match_index: None
exitstatus: None
flag_eof: True
pid: 1395
child_fd: 11
closed: False
timeout: 30
delimiter: <class 'pexpect.exceptions.EOF'>
logfile: None
logfile_read: None
logfile_send: None
maxread: 2000
ignorecase: False
searchwindowsize: None
delaybeforesend: 0.05
delayafterclose: 0.1
delayafterterminate: 0.1
searcher: searcher_re:
    0: re.compile(b'All updates applied')
	[<TracebackEntry /sd-root/admin/tests/test_integration.py:808>, <TracebackEntry /sd-root/admin/.tox/py3/lib/python3.7/site-packages/pexpect/spawnbase.py:341>, <TracebackEntry /sd-root/admin/.tox/py3/lib/python3.7/site-packages/pexpect/spawnbase.py:369>, <TracebackEntry /sd-root/admin/.tox/py3/lib/python3.7/site-packages/pexpect/expect.py:117>, <TracebackEntry /sd-root/admin/.tox/py3/lib/python3.7/site-packages/pexpect/expect.py:63>]
test_check_for_update_when_updates_not_needed failed (1 runs remaining out of 3).
	<class 'pexpect.exceptions.EOF'>
	End Of File (EOF). Exception style platform.
<pexpect.pty_spawn.spawn object at 0x7f4babeee6d8>
command: /sd-root/admin/.tox/py3/bin/coverage
args: ['/sd-root/admin/.tox/py3/bin/coverage', 'run', '/sd-root/admin/securedrop_admin/__init__.py', '--root', '/tmp/pytest-of-user/pytest-0/test_check_for_update_when_upd2/securedrop/install_files/ansible-base', 'check_for_updates']
buffer (last 100 chars): b''
before (last 100 chars): b'INFO: Checking for SecureDrop updates...\r\nFetching origin\r\nINFO: Update needed\r\n'
after: <class 'pexpect.exceptions.EOF'>
match: None
match_index: None
exitstatus: None
flag_eof: True
pid: 1430
child_fd: 12
closed: False
timeout: 30
delimiter: <class 'pexpect.exceptions.EOF'>
logfile: None
logfile_read: None
logfile_send: None
maxread: 2000
ignorecase: False
searchwindowsize: None
delaybeforesend: 0.05
delayafterclose: 0.1
delayafterterminate: 0.1
searcher: searcher_re:
    0: re.compile(b'All updates applied')
	[<TracebackEntry /sd-root/admin/tests/test_integration.py:808>, <TracebackEntry /sd-root/admin/.tox/py3/lib/python3.7/site-packages/pexpect/spawnbase.py:341>, <TracebackEntry /sd-root/admin/.tox/py3/lib/python3.7/site-packages/pexpect/spawnbase.py:369>, <TracebackEntry /sd-root/admin/.tox/py3/lib/python3.7/site-packages/pexpect/expect.py:117>, <TracebackEntry /sd-root/admin/.tox/py3/lib/python3.7/site-packages/pexpect/expect.py:63>]
test_check_for_update_when_updates_not_needed failed; it passed 0 out of the required 1 times.
	<class 'pexpect.exceptions.EOF'>
	End Of File (EOF). Exception style platform.
<pexpect.pty_spawn.spawn object at 0x7f4bab33d860>
command: /sd-root/admin/.tox/py3/bin/coverage
args: ['/sd-root/admin/.tox/py3/bin/coverage', 'run', '/sd-root/admin/securedrop_admin/__init__.py', '--root', '/tmp/pytest-of-user/pytest-0/test_check_for_update_when_upd3/securedrop/install_files/ansible-base', 'check_for_updates']
buffer (last 100 chars): b''
before (last 100 chars): b'INFO: Checking for SecureDrop updates...\r\nFetching origin\r\nINFO: Update needed\r\n'
after: <class 'pexpect.exceptions.EOF'>
match: None
match_index: None
exitstatus: None
flag_eof: True
pid: 1465
child_fd: 13
closed: False
timeout: 30
delimiter: <class 'pexpect.exceptions.EOF'>
logfile: None
logfile_read: None
logfile_send: None
maxread: 2000
ignorecase: False
searchwindowsize: None
delaybeforesend: 0.05
delayafterclose: 0.1
delayafterterminate: 0.1
searcher: searcher_re:
    0: re.compile(b'All updates applied')
	[<TracebackEntry /sd-root/admin/tests/test_integration.py:808>, <TracebackEntry /sd-root/admin/.tox/py3/lib/python3.7/site-packages/pexpect/spawnbase.py:341>, <TracebackEntry /sd-root/admin/.tox/py3/lib/python3.7/site-packages/pexpect/spawnbase.py:369>, <TracebackEntry /sd-root/admin/.tox/py3/lib/python3.7/site-packages/pexpect/expect.py:117>, <TracebackEntry /sd-root/admin/.tox/py3/lib/python3.7/site-packages/pexpect/expect.py:63>]
test_update passed 1 out of the required 1 times. Success!
test_update_fails_when_no_signature_present passed 1 out of the required 1 times. Success!
test_update_with_duplicate_branch_and_tag failed (2 runs remaining out of 3).
	<class 'AssertionError'>
	assert b'Updated to SecureDrop' not in b'INFO: Applying SecureDrop updates...\r\nINFO: Checking for SecureDrop updates...\r\nFetching origin\r\nINFO: Update ...on was 4cbab07fd SecureDrop 0.6\r\nHEAD is now at 70b9de460 SecureDrop 1.8.0\r\nINFO: Updated to SecureDrop 1.8.0.\r\n'
	[<TracebackEntry /sd-root/admin/tests/test_integration.py:894>]
test_update_with_duplicate_branch_and_tag failed (1 runs remaining out of 3).
	<class 'AssertionError'>
	assert b'Updated to SecureDrop' not in b'INFO: Applying SecureDrop updates...\r\nINFO: Checking for SecureDrop updates...\r\nFetching origin\r\nINFO: Update ...on was 4cbab07fd SecureDrop 0.6\r\nHEAD is now at 70b9de460 SecureDrop 1.8.0\r\nINFO: Updated to SecureDrop 1.8.0.\r\n'
	[<TracebackEntry /sd-root/admin/tests/test_integration.py:894>]
test_update_with_duplicate_branch_and_tag failed; it passed 0 out of the required 1 times.
	<class 'AssertionError'>
	assert b'Updated to SecureDrop' not in b'INFO: Applying SecureDrop updates...\r\nINFO: Checking for SecureDrop updates...\r\nFetching origin\r\nINFO: Update ...on was 4cbab07fd SecureDrop 0.6\r\nHEAD is now at 70b9de460 SecureDrop 1.8.0\r\nINFO: Updated to SecureDrop 1.8.0.\r\n'
	[<TracebackEntry /sd-root/admin/tests/test_integration.py:894>]
test_verbose passed 1 out of the required 1 times. Success!
test_not_verbose passed 1 out of the required 1 times. Success!
test_update_check_decorator_when_no_update_needed passed 1 out of the required 1 times. Success!
test_update_check_decorator_when_update_needed passed 1 out of the required 1 times. Success!
test_update_check_decorator_when_skipped passed 1 out of the required 1 times. Success!
test_check_for_updates_update_needed passed 1 out of the required 1 times. Success!
test_check_for_updates_higher_version passed 1 out of the required 1 times. Success!
test_check_for_updates_ensure_newline_stripped passed 1 out of the required 1 times. Success!
test_check_for_updates_update_not_needed passed 1 out of the required 1 times. Success!
test_check_for_updates_if_most_recent_tag_is_rc passed 1 out of the required 1 times. Success!
test_get_git_branch[* develop\n-develop] passed 1 out of the required 1 times. Success!
test_get_git_branch[ develop\n* release/1.7.0\n-release/1.7.0] passed 1 out of the required 1 times. Success!
test_get_git_branch[* (HEAD detached at 1.7.0)\n  develop\n  release/1.7.0\n-(HEAD detached at 1.7.0)] passed 1 out of the required 1 times. Success!
test_get_git_branch[  main\n* valid_+!@#$%&_branch_name\n-valid_+!@#$%&_branch_name] passed 1 out of the required 1 times. Success!
test_get_git_branch[Unrecognized output.-None] passed 1 out of the required 1 times. Success!
test_update_exits_if_not_needed passed 1 out of the required 1 times. Success!
test_get_release_key_from_valid_keyserver passed 1 out of the required 1 times. Success!
test_update_signature_verifies[gpg: Signature made Tue 13 Mar 2018 01:14:11 AM UTC\ngpg:                using RSA key 22245C81E3BAEB4138B36061310F561200F4AD77\ngpg: Good signature from "SecureDrop Release Signing Key" [unknown]\n] passed 1 out of the required 1 times. Success!
test_update_signature_verifies[gpg: Signature made Thu 20 Jul 2017 08:12:25 PM EDT\ngpg:                using RSA key 22245C81E3BAEB4138B36061310F561200F4AD77\ngpg: Good signature from "SecureDrop Release Signing Key <[email protected]>"\n] passed 1 out of the required 1 times. Success!
test_update_signature_verifies[gpg: Signature made Thu 20 Jul 2017 08:12:25 PM EDT\ngpg:                using RSA key 22245C81E3BAEB4138B36061310F561200F4AD77\ngpg: Good signature from "SecureDrop Release Signing Key" [unknown]\ngpg:                 aka "SecureDrop Release Signing Key <[email protected]>" [unknown]\n] passed 1 out of the required 1 times. Success!
test_update_unexpected_exception_git_refs passed 1 out of the required 1 times. Success!
test_update_signature_does_not_verify passed 1 out of the required 1 times. Success!
test_update_malicious_key_named_fingerprint passed 1 out of the required 1 times. Success!
test_update_malicious_key_named_good_sig passed 1 out of the required 1 times. Success!
test_update_malicious_key_named_good_sig_fingerprint passed 1 out of the required 1 times. Success!
test_no_signature_on_update passed 1 out of the required 1 times. Success!
test_exit_codes passed 1 out of the required 1 times. Success!

===End Flaky Test Report===

==================================================================================================== FAILURES ====================================================================================================
_________________________________________________________________________________ test_check_for_update_when_updates_not_needed __________________________________________________________________________________

self = <pexpect.pty_spawn.spawn object at 0x7f4bab33d860>, size = 2000, timeout = None

    def read_nonblocking(self, size=1, timeout=None):
        """This reads data from the file descriptor.
    
            This is a simple implementation suitable for a regular file. Subclasses using ptys or pipes should override it.
    
            The timeout parameter is ignored.
            """
    
        try:
>           s = os.read(self.child_fd, size)
E           OSError: [Errno 5] Input/output error

/sd-root/admin/.tox/py3/lib/python3.7/site-packages/pexpect/spawnbase.py:166: OSError

During handling of the above exception, another exception occurred:

self = <pexpect.expect.Expecter object at 0x7f4bab4096a0>, timeout = 19.382601976394653

    def expect_loop(self, timeout=-1):
        """Blocking expect"""
        spawn = self.spawn
    
        if timeout is not None:
            end_time = time.time() + timeout
    
        try:
            incoming = spawn.buffer
            spawn._buffer = spawn.buffer_type()
            spawn._before = spawn.buffer_type()
            while True:
                idx = self.new_data(incoming)
                # Keep reading until exception or return.
                if idx is not None:
                    return idx
                # No match at this point
                if (timeout is not None) and (timeout < 0):
                    return self.timeout()
                # Still have time left, so read more data
>               incoming = spawn.read_nonblocking(spawn.maxread, timeout)

/sd-root/admin/.tox/py3/lib/python3.7/site-packages/pexpect/expect.py:111: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <pexpect.pty_spawn.spawn object at 0x7f4bab33d860>, size = 2000, timeout = 19.382601976394653

    def read_nonblocking(self, size=1, timeout=-1):
        '''This reads at most size characters from the child application. It
            includes a timeout. If the read does not complete within the timeout
            period then a TIMEOUT exception is raised. If the end of file is read
            then an EOF exception will be raised.  If a logfile is specified, a
            copy is written to that log.
    
            If timeout is None then the read may block indefinitely.
            If timeout is -1 then the self.timeout value is used. If timeout is 0
            then the child is polled and if there is no data immediately ready
            then this will raise a TIMEOUT exception.
    
            The timeout refers only to the amount of time to read at least one
            character. This is not affected by the 'size' parameter, so if you call
            read_nonblocking(size=100, timeout=30) and only one character is
            available right away then one character will be returned immediately.
            It will not wait for 30 seconds for another 99 characters to come in.
    
            This is a wrapper around os.read(). It uses select.select() to
            implement the timeout. '''
    
        if self.closed:
            raise ValueError('I/O operation on closed file.')
    
        if timeout == -1:
            timeout = self.timeout
    
        # Note that some systems such as Solaris do not give an EOF when
        # the child dies. In fact, you can still try to read
        # from the child_fd -- it will block forever or until TIMEOUT.
        # For this case, I test isalive() before doing any reading.
        # If isalive() is false, then I pretend that this is the same as EOF.
        if not self.isalive():
            # timeout of 0 means "poll"
            if self.use_poll:
                r = poll_ignore_interrupts([self.child_fd], timeout)
            else:
                r, w, e = select_ignore_interrupts([self.child_fd], [], [], 0)
            if not r:
                self.flag_eof = True
                raise EOF('End Of File (EOF). Braindead platform.')
        elif self.__irix_hack:
            # Irix takes a long time before it realizes a child was terminated.
            # FIXME So does this mean Irix systems are forced to always have
            # FIXME a 2 second delay when calling read_nonblocking? That sucks.
            if self.use_poll:
                r = poll_ignore_interrupts([self.child_fd], timeout)
            else:
                r, w, e = select_ignore_interrupts([self.child_fd], [], [], 2)
            if not r and not self.isalive():
                self.flag_eof = True
                raise EOF('End Of File (EOF). Slow platform.')
        if self.use_poll:
            r = poll_ignore_interrupts([self.child_fd], timeout)
        else:
            r, w, e = select_ignore_interrupts(
                [self.child_fd], [], [], timeout
            )
    
        if not r:
            if not self.isalive():
                # Some platforms, such as Irix, will claim that their
                # processes are alive; timeout on the select; and
                # then finally admit that they are not alive.
                self.flag_eof = True
                raise EOF('End of File (EOF). Very slow platform.')
            else:
                raise TIMEOUT('Timeout exceeded.')
    
        if self.child_fd in r:
>           return super(spawn, self).read_nonblocking(size)

/sd-root/admin/.tox/py3/lib/python3.7/site-packages/pexpect/pty_spawn.py:485: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <pexpect.pty_spawn.spawn object at 0x7f4bab33d860>, size = 2000, timeout = None

    def read_nonblocking(self, size=1, timeout=None):
        """This reads data from the file descriptor.
    
            This is a simple implementation suitable for a regular file. Subclasses using ptys or pipes should override it.
    
            The timeout parameter is ignored.
            """
    
        try:
            s = os.read(self.child_fd, size)
        except OSError as err:
            if err.args[0] == errno.EIO:
                # Linux-style EOF
                self.flag_eof = True
>               raise EOF('End Of File (EOF). Exception style platform.')
E               pexpect.exceptions.EOF: End Of File (EOF). Exception style platform.

/sd-root/admin/.tox/py3/lib/python3.7/site-packages/pexpect/spawnbase.py:171: EOF

During handling of the above exception, another exception occurred:

securedrop_git_repo = local('/tmp/pytest-of-user/pytest-0/test_check_for_update_when_upd3')

    @flaky(max_runs=3)
    def test_check_for_update_when_updates_not_needed(securedrop_git_repo):
        # Determine latest production tag using GitHub release object
        github_url = 'https://api.github.com/repos/freedomofpress/securedrop/releases/latest'  # noqa: E501
        latest_release = requests.get(github_url).json()
        latest_tag = str(latest_release["tag_name"])
    
        subprocess.check_call(["git", "checkout", latest_tag])
    
        cmd = os.path.join(os.path.dirname(CURRENT_DIR),
                           'securedrop_admin/__init__.py')
        ansible_base = os.path.join(str(securedrop_git_repo),
                                    'securedrop/install_files/ansible-base')
        fullcmd = 'coverage run {0} --root {1} check_for_updates'.format(
            cmd, ansible_base)
        child = pexpect.spawn(fullcmd)
>       child.expect(b'All updates applied', timeout=20)

/sd-root/admin/tests/test_integration.py:808: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/sd-root/admin/.tox/py3/lib/python3.7/site-packages/pexpect/spawnbase.py:341: in expect
    timeout, searchwindowsize, async_)
/sd-root/admin/.tox/py3/lib/python3.7/site-packages/pexpect/spawnbase.py:369: in expect_list
    return exp.expect_loop(timeout)
/sd-root/admin/.tox/py3/lib/python3.7/site-packages/pexpect/expect.py:117: in expect_loop
    return self.eof(e)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <pexpect.expect.Expecter object at 0x7f4bab4096a0>, err = EOF('End Of File (EOF). Exception style platform.')

    def eof(self, err=None):
        spawn = self.spawn
    
        spawn.before = spawn.buffer
        spawn._buffer = spawn.buffer_type()
        spawn._before = spawn.buffer_type()
        spawn.after = EOF
        index = self.searcher.eof_index
        if index >= 0:
            spawn.match = EOF
            spawn.match_index = index
            return index
        else:
            spawn.match = None
            spawn.match_index = None
            msg = str(spawn)
            msg += '\nsearcher: %s' % self.searcher
            if err is not None:
                msg = str(err) + '\n' + msg
>           raise EOF(msg)
E           pexpect.exceptions.EOF: End Of File (EOF). Exception style platform.
E           <pexpect.pty_spawn.spawn object at 0x7f4bab33d860>
E           command: /sd-root/admin/.tox/py3/bin/coverage
E           args: ['/sd-root/admin/.tox/py3/bin/coverage', 'run', '/sd-root/admin/securedrop_admin/__init__.py', '--root', '/tmp/pytest-of-user/pytest-0/test_check_for_update_when_upd3/securedrop/install_files/ansible-base', 'check_for_updates']
E           buffer (last 100 chars): b''
E           before (last 100 chars): b'INFO: Checking for SecureDrop updates...\r\nFetching origin\r\nINFO: Update needed\r\n'
E           after: <class 'pexpect.exceptions.EOF'>
E           match: None
E           match_index: None
E           exitstatus: None
E           flag_eof: True
E           pid: 1465
E           child_fd: 13
E           closed: False
E           timeout: 30
E           delimiter: <class 'pexpect.exceptions.EOF'>
E           logfile: None
E           logfile_read: None
E           logfile_send: None
E           maxread: 2000
E           ignorecase: False
E           searchwindowsize: None
E           delaybeforesend: 0.05
E           delayafterclose: 0.1
E           delayafterterminate: 0.1
E           searcher: searcher_re:
E               0: re.compile(b'All updates applied')

/sd-root/admin/.tox/py3/lib/python3.7/site-packages/pexpect/expect.py:63: EOF
--------------------------------------------------------------------------------------------- Captured stdout setup ----------------------------------------------------------------------------------------------
HEAD is now at 5e891974c Merge pull request #5859 from freedomofpress/i18n-merge-1.8.0
--------------------------------------------------------------------------------------------- Captured stderr setup ----------------------------------------------------------------------------------------------
Cloning into 'securedrop'...
Note: checking out '0.6'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 4cbab07fd SecureDrop 0.6
---------------------------------------------------------------------------------------------- Captured stderr call ----------------------------------------------------------------------------------------------
Previous HEAD position was 4cbab07fd SecureDrop 0.6
HEAD is now at aaca72cb7 SecureDrop 1.7.1
----------------------------------------------------------------------------------------------- Captured log call ------------------------------------------------------------------------------------------------
connectionpool.py          943 DEBUG    Starting new HTTPS connection (1): api.github.com:443
connectionpool.py          442 DEBUG    https://api.github.com:443 "GET /repos/freedomofpress/securedrop/releases/latest HTTP/1.1" 200 687
--------------------------------------------------------------------------------------------- Captured stdout setup ----------------------------------------------------------------------------------------------
HEAD is now at 5e891974c Merge pull request #5859 from freedomofpress/i18n-merge-1.8.0
--------------------------------------------------------------------------------------------- Captured stderr setup ----------------------------------------------------------------------------------------------
Cloning into 'securedrop'...
Note: checking out '0.6'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 4cbab07fd SecureDrop 0.6
---------------------------------------------------------------------------------------------- Captured stderr call ----------------------------------------------------------------------------------------------
Previous HEAD position was 4cbab07fd SecureDrop 0.6
HEAD is now at aaca72cb7 SecureDrop 1.7.1
----------------------------------------------------------------------------------------------- Captured log call ------------------------------------------------------------------------------------------------
connectionpool.py          943 DEBUG    Starting new HTTPS connection (1): api.github.com:443
connectionpool.py          442 DEBUG    https://api.github.com:443 "GET /repos/freedomofpress/securedrop/releases/latest HTTP/1.1" 200 687
--------------------------------------------------------------------------------------------- Captured stdout setup ----------------------------------------------------------------------------------------------
HEAD is now at 5e891974c Merge pull request #5859 from freedomofpress/i18n-merge-1.8.0
--------------------------------------------------------------------------------------------- Captured stderr setup ----------------------------------------------------------------------------------------------
Cloning into 'securedrop'...
Note: checking out '0.6'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 4cbab07fd SecureDrop 0.6
---------------------------------------------------------------------------------------------- Captured stderr call ----------------------------------------------------------------------------------------------
Previous HEAD position was 4cbab07fd SecureDrop 0.6
HEAD is now at aaca72cb7 SecureDrop 1.7.1
----------------------------------------------------------------------------------------------- Captured log call ------------------------------------------------------------------------------------------------
connectionpool.py          943 DEBUG    Starting new HTTPS connection (1): api.github.com:443
connectionpool.py          442 DEBUG    https://api.github.com:443 "GET /repos/freedomofpress/securedrop/releases/latest HTTP/1.1" 200 687
___________________________________________________________________________________ test_update_with_duplicate_branch_and_tag ____________________________________________________________________________________

securedrop_git_repo = local('/tmp/pytest-of-user/pytest-0/test_update_with_duplicate_bra2')

    @flaky(max_runs=3)
    def test_update_with_duplicate_branch_and_tag(securedrop_git_repo):
        gpgdir = os.path.join(os.path.expanduser('~'), '.gnupg')
        set_reliable_keyserver(gpgdir)
    
        github_url = 'https://api.github.com/repos/freedomofpress/securedrop/releases/latest'  # noqa: E501
        latest_release = requests.get(github_url).json()
        latest_tag = str(latest_release["tag_name"])
    
        # Create a branch with the same name as a tag.
        subprocess.check_call(['git', 'checkout', '-b', latest_tag])
        # Checkout the older tag again in preparation for the update.
        subprocess.check_call('git checkout 0.6'.split())
    
        cmd = os.path.join(os.path.dirname(CURRENT_DIR),
                           'securedrop_admin/__init__.py')
        ansible_base = os.path.join(str(securedrop_git_repo),
                                    'securedrop/install_files/ansible-base')
    
        child = pexpect.spawn('coverage run {0} --root {1} update'.format(
                              cmd, ansible_base))
        output = child.read()
        # Verify that we do not falsely check out a branch instead of a tag.
        assert b'Switched to branch' not in output
>       assert b'Updated to SecureDrop' not in output
E       AssertionError: assert b'Updated to SecureDrop' not in b'INFO: Applying SecureDrop updates...\r\nINFO: Checking for SecureDrop updates...\r\nFetching origin\r\nINFO: Update ...on was 4cbab07fd SecureDrop 0.6\r\nHEAD is now at 70b9de460 SecureDrop 1.8.0\r\nINFO: Updated to SecureDrop 1.8.0.\r\n'

/sd-root/admin/tests/test_integration.py:894: AssertionError
--------------------------------------------------------------------------------------------- Captured stdout setup ----------------------------------------------------------------------------------------------
HEAD is now at 5e891974c Merge pull request #5859 from freedomofpress/i18n-merge-1.8.0
--------------------------------------------------------------------------------------------- Captured stderr setup ----------------------------------------------------------------------------------------------
Cloning into 'securedrop'...
Note: checking out '0.6'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 4cbab07fd SecureDrop 0.6
---------------------------------------------------------------------------------------------- Captured stderr call ----------------------------------------------------------------------------------------------
Switched to a new branch '1.7.1'
Note: checking out '0.6'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 4cbab07fd SecureDrop 0.6
----------------------------------------------------------------------------------------------- Captured log call ------------------------------------------------------------------------------------------------
connectionpool.py          943 DEBUG    Starting new HTTPS connection (1): api.github.com:443
connectionpool.py          442 DEBUG    https://api.github.com:443 "GET /repos/freedomofpress/securedrop/releases/latest HTTP/1.1" 200 687
--------------------------------------------------------------------------------------------- Captured stdout setup ----------------------------------------------------------------------------------------------
HEAD is now at 5e891974c Merge pull request #5859 from freedomofpress/i18n-merge-1.8.0
--------------------------------------------------------------------------------------------- Captured stderr setup ----------------------------------------------------------------------------------------------
Cloning into 'securedrop'...
Note: checking out '0.6'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 4cbab07fd SecureDrop 0.6
---------------------------------------------------------------------------------------------- Captured stderr call ----------------------------------------------------------------------------------------------
Switched to a new branch '1.7.1'
Note: checking out '0.6'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 4cbab07fd SecureDrop 0.6
----------------------------------------------------------------------------------------------- Captured log call ------------------------------------------------------------------------------------------------
connectionpool.py          943 DEBUG    Starting new HTTPS connection (1): api.github.com:443
connectionpool.py          442 DEBUG    https://api.github.com:443 "GET /repos/freedomofpress/securedrop/releases/latest HTTP/1.1" 200 687
--------------------------------------------------------------------------------------------- Captured stdout setup ----------------------------------------------------------------------------------------------
HEAD is now at 5e891974c Merge pull request #5859 from freedomofpress/i18n-merge-1.8.0
--------------------------------------------------------------------------------------------- Captured stderr setup ----------------------------------------------------------------------------------------------
Cloning into 'securedrop'...
Note: checking out '0.6'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 4cbab07fd SecureDrop 0.6
---------------------------------------------------------------------------------------------- Captured stderr call ----------------------------------------------------------------------------------------------
Switched to a new branch '1.7.1'
Note: checking out '0.6'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 4cbab07fd SecureDrop 0.6
----------------------------------------------------------------------------------------------- Captured log call ------------------------------------------------------------------------------------------------
connectionpool.py          943 DEBUG    Starting new HTTPS connection (1): api.github.com:443
connectionpool.py          442 DEBUG    https://api.github.com:443 "GET /repos/freedomofpress/securedrop/releases/latest HTTP/1.1" 200 687
===================================================================================== 2 failed, 80 passed in 427.89 seconds ======================================================================================
ERROR: InvocationError: '/usr/bin/env /sd-root/admin/.tox/py3/bin/coverage run --source=securedrop_admin,bootstrap /sd-root/admin/.tox/py3/bin/pytest -v tests'
____________________________________________________________________________________________________ summary _____________________________________________________________________________________________________
  pylint: commands succeeded
  flake8: commands succeeded
ERROR:   py3: commands failed
make: *** [Makefile:5: test] Error 1
make: Leaving directory '/home/user/securedrop/admin'

@eloquence
Copy link
Member

I can reproduce the same test failures locally, as well.

@eloquence
Copy link
Member

(Tracked in #5864; I think we can safely say that the test failure is unrelated to this PR.)

@emkll
Copy link
Contributor

emkll commented Mar 11, 2021

CI is now passing, merging

@emkll emkll merged commit 4dd4d4b into release/1.8.0 Mar 11, 2021
@emkll emkll deleted the update-to-1.8.0 branch March 11, 2021 22:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants