freedomofpress / securedrop

GitHub repository for the SecureDrop whistleblower platform. Do not submit tips here!
https://securedrop.org/
Other
3.6k stars 685 forks source link

Release SecureDrop 2.3.2 #6426

Closed zenmonkeykstop closed 2 years ago

zenmonkeykstop commented 2 years ago

This is a tracking issue for the release of SecureDrop 2.3.2

Tentatively scheduled as follows:

Pre-release announcement: 2022-05-03 Release date: 2022-05-05

Release manager: KOG Deputy release manager: TBD Communications manager:: TBD (As this is a hotfix release with no translated string changes, no LM is assigned.)

SecureDrop maintainers and testers: As you QA 2.3.2, please report back your testing results as comments on this ticket. File GitHub issues for any problems found, tag them "QA: Release".

Test debian packages will be posted on https://apt-test.freedom.press signed with the test key. An Ansible playbook testing the upgrade path is here.

QA Matrix for 2.3.2

Test Plan for 2.3.2

Prepare release candidate (2.3.2~rc1)

After each test, please update the QA matrix and post details for Basic Server Testing, Application Acceptance Testing and release-specific testing below in comments to this ticket.

Final release

Post release

cfm commented 2 years ago

Basic Server Testing

Exceptions:

FAILED common/test_automatic_updates.py::test_automatic_updates_dependencies[paramiko:/mon]
FAILED common/test_automatic_updates.py::test_cron_apt_config[paramiko:/mon]
FAILED common/test_automatic_updates.py::test_unattended_upgrades_functional[paramiko:/app]

Command Line User Generation

Administration

Application Acceptance Testing

Source Interface

Landing page base cases
First submission base cases
Returning source base cases

Journalist Interface

Login base cases
Index base cases
Individual source page

Basic Tails Testing

After updating to this release candidate and running securedrop-admin tailsconfig

2.3.2 release-specific changes

Tails Upgrade, Tails 4.29 to Tails 5.0

Except for securedrop-admin verify failures logged above.

For application testing, repeated only those cases involving the Admin Workstation:

FAILED common/test_automatic_updates.py::test_all_packages_updated[paramiko:/app] FAILED common/test_automatic_updates.py::test_unattended_upgrades_functional[paramiko:/mon] FAILED common/test_automatic_updates.py::test_all_packages_updated[paramiko:/mon] FAILED common/test_automatic_updates.py::test_unattended_upgrades_functional[paramiko:/app] ``` =================================== FAILURES =================================== __________________ test_all_packages_updated[paramiko://app] ___________________ [gw1] linux -- Python 3.9.2 /home/amnesia/Persistent/securedrop/admin/.venv3/bin/python host = def test_all_packages_updated(host): """ Ensure a safe-upgrade has already been run, by checking that no packages are eligible for upgrade currently. The Ansible config installs a specific, out-of-date version of Firefox for use with Selenium. Therefore apt will report it's possible to upgrade Firefox, which we'll need to mark as "OK" in terms of the tests. """ c = host.run('apt-get dist-upgrade --simulate') assert c.rc == 0 # Staging hosts will have locally built deb packages, marked as held. # Staging and development will have a version-locked Firefox pinned for # Selenium compatibility; if the holds are working, they shouldn't be # upgraded. # Example output: # 0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded. # Don't test for the "not upgraded" because those map to held packages. > assert "0 upgraded, 0 newly installed, 0 to remove" in c.stdout E assert '0 upgraded, 0 newly installed, 0 to remove' in 'NOTE: This is only a simulation!\n apt-get needs root privileges for real execution.\n Keep also in mind th...l-security [all])\nConf openssl (1.1.1f-1ubuntu2.13 Ubuntu:20.04/focal-updates, Ubuntu:20.04/focal-security [amd64])\n' E + where 'NOTE: This is only a simulation!\n apt-get needs root privileges for real execution.\n Keep also in mind th...l-security [all])\nConf openssl (1.1.1f-1ubuntu2.13 Ubuntu:20.04/focal-updates, Ubuntu:20.04/focal-security [amd64])\n' = CommandResult(command=b'apt-get dist-upgrade --simulate', exit_status=0, stdout=b"NOTE: This is only a simulation!\n ...l])\nConf openssl (1.1.1f-1ubuntu2.13 Ubuntu:20.04/focal-updates, Ubuntu:20.04/focal-security [amd64])\n", stderr=None).stdout common/test_automatic_updates.py:206: AssertionError _____________ test_unattended_upgrades_functional[paramiko://mon] ______________ [gw1] linux -- Python 3.9.2 /home/amnesia/Persistent/securedrop/admin/.venv3/bin/python host = def test_unattended_upgrades_functional(host): """ Ensure unatteded-upgrades completes successfully and ensures all packages are up-to-date. """ c = host.run('sudo unattended-upgrades --dry-run --debug') assert c.rc == 0 expected_origins = ( "Allowed origins are: origin=Ubuntu,archive=focal, origin=Ubuntu,archive=focal-security" ", origin=Ubuntu,archive=focal-updates, origin=SecureDrop,codename=focal" ) expected_result = ( "No packages found that can be upgraded unattended and no pending auto-removals" ) assert expected_origins in c.stdout > assert expected_result in c.stdout E assert 'No packages found that can be upgraded unattended and no pending auto-removals' in "Starting unattended upgrades script\nAllowed origins are: origin=Ubuntu,archive=focal, origin=Ubuntu,archive=focal-se...ades installed\nInstCount=0 DelCount=0 BrokenCount=0\nThe list of kept packages can't be calculated in dry-run mode.\n" E + where "Starting unattended upgrades script\nAllowed origins are: origin=Ubuntu,archive=focal, origin=Ubuntu,archive=focal-se...ades installed\nInstCount=0 DelCount=0 BrokenCount=0\nThe list of kept packages can't be calculated in dry-run mode.\n" = CommandResult(command=b'sudo unattended-upgrades --dry-run --debug', exit_status=0, stdout=b"Starting unattended upgra.../usr/bin/dpkg --force-confdef --force-confold --force-confdef --force-confold --status-fd 10 --configure --pending \n').stdout common/test_automatic_updates.py:130: AssertionError __________________ test_all_packages_updated[paramiko://mon] ___________________ [gw1] linux -- Python 3.9.2 /home/amnesia/Persistent/securedrop/admin/.venv3/bin/python host = def test_all_packages_updated(host): """ Ensure a safe-upgrade has already been run, by checking that no packages are eligible for upgrade currently. The Ansible config installs a specific, out-of-date version of Firefox for use with Selenium. Therefore apt will report it's possible to upgrade Firefox, which we'll need to mark as "OK" in terms of the tests. """ c = host.run('apt-get dist-upgrade --simulate') assert c.rc == 0 # Staging hosts will have locally built deb packages, marked as held. # Staging and development will have a version-locked Firefox pinned for # Selenium compatibility; if the holds are working, they shouldn't be # upgraded. # Example output: # 0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded. # Don't test for the "not upgraded" because those map to held packages. > assert "0 upgraded, 0 newly installed, 0 to remove" in c.stdout E assert '0 upgraded, 0 newly installed, 0 to remove' in 'NOTE: This is only a simulation!\n apt-get needs root privileges for real execution.\n Keep also in mind th...l-security [all])\nConf openssl (1.1.1f-1ubuntu2.13 Ubuntu:20.04/focal-updates, Ubuntu:20.04/focal-security [amd64])\n' E + where 'NOTE: This is only a simulation!\n apt-get needs root privileges for real execution.\n Keep also in mind th...l-security [all])\nConf openssl (1.1.1f-1ubuntu2.13 Ubuntu:20.04/focal-updates, Ubuntu:20.04/focal-security [amd64])\n' = CommandResult(command=b'apt-get dist-upgrade --simulate', exit_status=0, stdout=b"NOTE: This is only a simulation!\n ...l])\nConf openssl (1.1.1f-1ubuntu2.13 Ubuntu:20.04/focal-updates, Ubuntu:20.04/focal-security [amd64])\n", stderr=None).stdout common/test_automatic_updates.py:206: AssertionError _____________ test_unattended_upgrades_functional[paramiko://app] ______________ [gw0] linux -- Python 3.9.2 /home/amnesia/Persistent/securedrop/admin/.venv3/bin/python host = def test_unattended_upgrades_functional(host): """ Ensure unatteded-upgrades completes successfully and ensures all packages are up-to-date. """ c = host.run('sudo unattended-upgrades --dry-run --debug') assert c.rc == 0 expected_origins = ( "Allowed origins are: origin=Ubuntu,archive=focal, origin=Ubuntu,archive=focal-security" ", origin=Ubuntu,archive=focal-updates, origin=SecureDrop,codename=focal" ) expected_result = ( "No packages found that can be upgraded unattended and no pending auto-removals" ) assert expected_origins in c.stdout > assert expected_result in c.stdout E assert 'No packages found that can be upgraded unattended and no pending auto-removals' in "Starting unattended upgrades script\nAllowed origins are: origin=Ubuntu,archive=focal, origin=Ubuntu,archive=focal-se...ades installed\nInstCount=0 DelCount=0 BrokenCount=0\nThe list of kept packages can't be calculated in dry-run mode.\n" E + where "Starting unattended upgrades script\nAllowed origins are: origin=Ubuntu,archive=focal, origin=Ubuntu,archive=focal-se...ades installed\nInstCount=0 DelCount=0 BrokenCount=0\nThe list of kept packages can't be calculated in dry-run mode.\n" = CommandResult(command=b'sudo unattended-upgrades --dry-run --debug', exit_status=0, stdout=b"Starting unattended upgra.../usr/bin/dpkg --force-confdef --force-confold --force-confdef --force-confold --status-fd 10 --configure --pending \n').stdout common/test_automatic_updates.py:130: AssertionError =========================== short test summary info ============================ FAILED common/test_automatic_updates.py::test_all_packages_updated[paramiko:/app] FAILED common/test_automatic_updates.py::test_unattended_upgrades_functional[paramiko:/mon] FAILED common/test_automatic_updates.py::test_all_packages_updated[paramiko:/mon] FAILED common/test_automatic_updates.py::test_unattended_upgrades_functional[paramiko:/app] = 4 failed, 433 passed, 7 skipped, 3 xfailed, 1 xpassed, 10 warnings in 781.33s (0:13:01) = ```

...

...

Yup, and breaks the 2.3.2-rc1 virtualenv! ;-) Required to recover:

amnesia@amnesia:~/Persistent/securedrop$ rm -rf admin/.venv3
amnesia@amnesia:~/Persistent/securedrop$ git checkout 2.3.2-rc1
amnesia@amnesia:~/Persistent/securedrop$ ./securedrop-admin setup
amnesia@amnesia:~/Persistent/securedrop$ ./securedrop-admin tailsconfig

Then a network bounce triggers the SecureDrop Updater prompt as expected.

zenmonkeykstop commented 2 years ago

2.3.2 QA Checklist

Environment

Basic Server Testing

Command Line User Generation

Administration

Application Acceptance Testing

Source Interface

Landing page base cases
First submission base cases
Returning source base cases

Journalist Interface

Login base cases
Index base cases
Individual source page

Basic Tails Testing

After updating to this release candidate and running securedrop-admin tailsconfig

2.3.2 release-specific changes

Tails Upgrade, Tails 4.29 to Tails 5.0

Preflight testing

Basic testing

Tails

eaon commented 2 years ago

Environment

Basic Server Testing

Command Line User Generation

Administration

Application Acceptance Testing

Source Interface

Landing page base cases
First submission base cases
Returning source base cases

Journalist Interface

Login base cases
Index base cases
Individual source page

Basic Tails Testing

After updating to this release candidate and running securedrop-admin tailsconfig

2.3.2 release-specific changes

zenmonkeykstop commented 2 years ago

Tested preflight upgrade scenario against 2.3.2 prod packages:

cfm commented 2 years ago

Preflight testing

Basic testing