Skip to content

Conversation

@joshuastegmaier
Copy link
Collaborator

@joshuastegmaier joshuastegmaier commented Dec 26, 2025

https://staff.loc.gov/tasks/browse/CONCD-1392

Unfortunately, there's no simple first-party way to get Node 20 on to a Bookworm image except by using a different base image--in which case, we'd need to do this same thing, only with Python 3.12 instead. NodeSource appears to be the standard third-party way to accomplish this.

The other alternative should be to copy Node from the bookworm Node 20 image, but that seems more error prone, and would leave our install of Node outside the apt system, so it could only be updated when the base image itself was updated, which would complicate, e.g., security updates, since we would need to wait for the underlying image to update rather than simply being able to grab the latest version with apt, like we can do by using NodeSource.

Removing the installation of node-gyp caused gcc and other packages needed for compiling some Python packages to not be installed, so I explicitly installed build-essential.

I also upgraded our version of Vite to the latest, since that was waiting on the upgrade to Node 20.

@LibraryOfCongress LibraryOfCongress deleted a comment from github-actions bot Dec 26, 2025
@LibraryOfCongress LibraryOfCongress deleted a comment from github-actions bot Dec 26, 2025
@github-actions
Copy link

github-actions bot commented Dec 26, 2025

🛡 Test Coverage Report 🛡

📜 Click to view full text coverage report
Name                                                                 Stmts   Miss Branch BrPart  Cover
------------------------------------------------------------------------------------------------------
concordia/__init__.py                                                    3      0      0      0   100%
concordia/admin/__init__.py                                            485      0     54      0   100%
concordia/admin/actions.py                                              96      0     22      0   100%
concordia/admin/filters.py                                             205      0     34      0   100%
concordia/admin/forms.py                                                73      0      2      0   100%
concordia/admin/utils.py                                                37      3     18      5    85%
concordia/admin/views.py                                               355      7     88      5    97%
concordia/admin_site.py                                                 10      0      0      0   100%
concordia/api_views.py                                                  72      0     32      0   100%
concordia/apps.py                                                       13      0      0      0   100%
concordia/authentication_backends.py                                    18      0      8      0   100%
concordia/celery.py                                                     24      0      6      0   100%
concordia/consumers.py                                                  14      0      0      0   100%
concordia/context_processors.py                                         20      0      4      0   100%
concordia/contextmanagers.py                                            15      0      2      0   100%
concordia/converters.py                                                  5      0      0      0   100%
concordia/decorators.py                                                 27      0      6      0   100%
concordia/exceptions.py                                                  6      0      0      0   100%
concordia/forms.py                                                      55      0      6      0   100%
concordia/logging.py                                                    78      0     34      0   100%
concordia/maintenance.py                                                18      0      8      0   100%
concordia/management/__init__.py                                         0      0      0      0   100%
concordia/management/commands/__init__.py                                0      0      0      0   100%
concordia/management/commands/ensure_initial_site_configuration.py      30      0     10      0   100%
concordia/management/commands/import_site_reports.py                    26      0      8      0   100%
concordia/management/commands/print_frontend_test_urls.py               20      0      4      0   100%
concordia/middleware.py                                                  8      0      2      0   100%
concordia/models.py                                                   1214      0    256      0   100%
concordia/parser.py                                                     67      0     14      0   100%
concordia/passwords/__init__.py                                          0      0      0      0   100%
concordia/passwords/validators.py                                       46      0     26      0   100%
concordia/signals/__init__.py                                            0      0      0      0   100%
concordia/signals/handlers.py                                          135      0     26      0   100%
concordia/signals/signals.py                                             3      0      0      0   100%
concordia/storage.py                                                    10      0      0      0   100%
concordia/tasks/__init__.py                                              0      0      0      0   100%
concordia/tasks/assets.py                                               83      0     34      0   100%
concordia/tasks/blog.py                                                 12      0      4      0   100%
concordia/tasks/housekeeping.py                                          9      0      0      0   100%
concordia/tasks/next_asset/__init__.py                                   0      0      0      0   100%
concordia/tasks/next_asset/renew.py                                     22      0      4      0   100%
concordia/tasks/next_asset/reviewable.py                                78      0     16      0   100%
concordia/tasks/next_asset/transcribable.py                             64      0     12      0   100%
concordia/tasks/reports/__init__.py                                      0      0      0      0   100%
concordia/tasks/reports/backfill.py                                     94      0     32      0   100%
concordia/tasks/reports/key_metrics.py                                 117      0     58      0   100%
concordia/tasks/reports/sitereport.py                                  211      0     22      0   100%
concordia/tasks/reservations.py                                         37      0      6      0   100%
concordia/tasks/resource.py                                             24      0      4      0   100%
concordia/tasks/retirement.py                                          114      0      8      0   100%
concordia/tasks/search_index.py                                         24      0      0      0   100%
concordia/tasks/thumbnails.py                                           42      0     10      0   100%
concordia/tasks/unusualactivity.py                                      33      0      6      0   100%
concordia/tasks/useractivity.py                                         76      0     12      0   100%
concordia/tasks/visualizations.py                                      117      0     22      0   100%
concordia/templatetags/__init__.py                                       0      0      0      0   100%
concordia/templatetags/concordia_filtering_tags.py                      18      0      4      0   100%
concordia/templatetags/concordia_media_tags.py                           6      0      0      0   100%
concordia/templatetags/concordia_querystring.py                         51      0     22      0   100%
concordia/templatetags/concordia_sharing_tags.py                         6      0      0      0   100%
concordia/templatetags/concordia_text_tags.py                           10      0      0      0   100%
concordia/templatetags/custom_math.py                                    6      0      0      0   100%
concordia/templatetags/group_list.py                                     7      0      0      0   100%
concordia/templatetags/reject_filter.py                                 13      0      4      0   100%
concordia/templatetags/truncation.py                                    37      0     14      0   100%
concordia/templatetags/visualization.py                                 16      0      2      0   100%
concordia/turnstile/__init__.py                                          0      0      0      0   100%
concordia/turnstile/context_processors.py                                5      0      0      0   100%
concordia/turnstile/fields.py                                           57      0     10      0   100%
concordia/turnstile/widgets.py                                          21      0      2      0   100%
concordia/utils/__init__.py                                             32      0      8      0   100%
concordia/utils/celery.py                                                7      0      0      0   100%
concordia/utils/constants.py                                             6      0      0      0   100%
concordia/utils/next_asset/__init__.py                                  12      0      0      0   100%
concordia/utils/next_asset/reviewable/__init__.py                        3      0      0      0   100%
concordia/utils/next_asset/reviewable/campaign.py                      106      0     28      0   100%
concordia/utils/next_asset/reviewable/topic.py                         106      0     28      0   100%
concordia/utils/next_asset/transcribable/__init__.py                     3      0      0      0   100%
concordia/utils/next_asset/transcribable/campaign.py                   136      0     60      0   100%
concordia/utils/next_asset/transcribable/topic.py                      143      0     62      0   100%
concordia/validators.py                                                 12      0      0      0   100%
concordia/version.py                                                     5      0      0      0   100%
concordia/views/__init__.py                                             34      0      4      0   100%
concordia/views/accounts.py                                            326      0     32      0   100%
concordia/views/ajax.py                                                313      0     70      0   100%
concordia/views/assets.py                                              255      0     64      0   100%
concordia/views/campaigns.py                                           156      0     32      0   100%
concordia/views/decorators.py                                           52      0      8      0   100%
concordia/views/items.py                                                67      0     10      0   100%
concordia/views/maintenance_mode.py                                     20      0      8      0   100%
concordia/views/projects.py                                             62      0     10      0   100%
concordia/views/rate_limit.py                                           13      0      4      0   100%
concordia/views/simple_pages.py                                         67      0     14      0   100%
concordia/views/topics.py                                               38      0      4      0   100%
concordia/views/utils.py                                               110      0     46      0   100%
concordia/views/visualizations.py                                       13      0      2      0   100%
concordia/widgets.py                                                     3      0      0      0   100%
configuration/__init__.py                                                0      0      0      0   100%
configuration/admin.py                                                  38      0     10      0   100%
configuration/apps.py                                                    6      0      0      0   100%
configuration/management/__init__.py                                     0      0      0      0   100%
configuration/management/commands/__init__.py                            0      0      0      0   100%
configuration/models.py                                                 46      0     12      0   100%
configuration/signals.py                                                11      0      0      0   100%
configuration/templatetags/__init__.py                                   0      0      0      0   100%
configuration/templatetags/configuration_tags.py                        11      0      0      0   100%
configuration/utils.py                                                  20      0      4      0   100%
configuration/validation.py                                             13      0      6      0   100%
exporter/__init__.py                                                     0      0      0      0   100%
exporter/admin.py                                                        0      0      0      0   100%
exporter/apps.py                                                         3      0      0      0   100%
exporter/exceptions.py                                                   6      0      0      0   100%
exporter/models.py                                                       0      0      0      0   100%
exporter/tabular_export/admin.py                                        27      0      2      0   100%
exporter/tabular_export/core.py                                        103      0     24      0   100%
exporter/utils.py                                                       29      0     16      0   100%
exporter/views.py                                                      161      0     20      0   100%
importer/__init__.py                                                     0      0      0      0   100%
importer/admin.py                                                      126      0     18      0   100%
importer/apps.py                                                         3      0      0      0   100%
importer/celery.py                                                      16      0      4      0   100%
importer/exceptions.py                                                   2      0      0      0   100%
importer/models.py                                                     119      0     14      0   100%
importer/tasks/__init__.py                                              13      0      2      0   100%
importer/tasks/assets.py                                                64      0     10      0   100%
importer/tasks/collections.py                                           57      0     18      0   100%
importer/tasks/decorators.py                                            38      0      6      0   100%
importer/tasks/images.py                                               115      0     22      0   100%
importer/tasks/items.py                                                233      0     60      0   100%
importer/utils/__init__.py                                               3      0      0      0   100%
importer/utils/excel.py                                                 17      0      8      0   100%
importer/utils/verify_images.py                                         14      0      2      0   100%
------------------------------------------------------------------------------------------------------
TOTAL                                                                 7992     10   1730     10    99%

@joshuastegmaier
Copy link
Collaborator Author

These changes were merged in with PR 3170.

@joshuastegmaier joshuastegmaier deleted the CONCD-1392-jstegmaier-node-20 branch January 5, 2026 15:48
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.

2 participants