From fda8c4b036511481e881f123511a5bd2044e6f66 Mon Sep 17 00:00:00 2001 From: Istvan Soos Date: Fri, 18 Apr 2025 16:08:10 +0200 Subject: [PATCH 1/4] Built files are only assert when the app starts in a container. --- Dockerfile.app | 1 + app/lib/frontend/static_files.dart | 18 ++++++++++++++++++ app/lib/service/entrypoint/frontend.dart | 6 +++++- app/lib/shared/env_config.dart | 4 ++++ 4 files changed, 28 insertions(+), 1 deletion(-) diff --git a/Dockerfile.app b/Dockerfile.app index 7fd0b143cc..178a4da740 100644 --- a/Dockerfile.app +++ b/Dockerfile.app @@ -10,6 +10,7 @@ RUN apt-get update && \ # Let the pub server know that this is not a "typical" pub client but rather a bot. ENV PUB_ENVIRONMENT="bot.pub_dartlang_org.docker" ENV PUB_CACHE="/project/.pub-cache" +ENV PUB_DEV_IN_CONTAINER="1" COPY app /project/app COPY pkg /project/pkg diff --git a/app/lib/frontend/static_files.dart b/app/lib/frontend/static_files.dart index 6d5fa749ab..479230e6b7 100644 --- a/app/lib/frontend/static_files.dart +++ b/app/lib/frontend/static_files.dart @@ -344,6 +344,24 @@ Future updateLocalBuiltFilesIfNeeded() async { _logger.info('Building pkg/web_css'); await updateWebCssBuild(); } + + await assertLocalBuiltFilesArePresent(); +} + +/// Checks whether the local built files are present, throws +/// [AssertionError] if anything is missing. +Future assertLocalBuiltFilesArePresent() async { + Future assertExists(String path) async { + final file = File(path); + if (!file.existsSync()) { + throw AssertionError('`$path`` is missing.'); + } + } + + final staticDirPath = resolveStaticDirPath(); + await assertExists(path.join(staticDirPath, 'js', 'script.dart.js')); + await assertExists(path.join(staticDirPath, 'css', 'style.css')); + await assertExists(path.join(staticDirPath, 'css', 'dartdoc.css')); } /// Runs build.sh in pkg/web_app diff --git a/app/lib/service/entrypoint/frontend.dart b/app/lib/service/entrypoint/frontend.dart index 3f56fcb5e5..46ec5f1523 100644 --- a/app/lib/service/entrypoint/frontend.dart +++ b/app/lib/service/entrypoint/frontend.dart @@ -41,7 +41,11 @@ class DefaultCommand extends Command { } Future _main() async { - await updateLocalBuiltFilesIfNeeded(); + if (envConfig.isInContainer) { + await assertLocalBuiltFilesArePresent(); + } else { + await updateLocalBuiltFilesIfNeeded(); + } final appHandler = createAppHandler(); if (envConfig.isRunningLocally) { diff --git a/app/lib/shared/env_config.dart b/app/lib/shared/env_config.dart index f0e7d7dbb4..c34af2c277 100644 --- a/app/lib/shared/env_config.dart +++ b/app/lib/shared/env_config.dart @@ -53,6 +53,10 @@ class _EnvConfig { /// True, if running inside AppEngine. bool get isRunningInAppengine => _gaeService != null && _gaeVersion != null; + /// True, if the application is running inside a container environment. + late final isInContainer = + Platform.environment['PUB_DEV_IN_CONTAINER'] == '1'; + /// True, if running locally and not inside AppEngine. bool get isRunningLocally => !isRunningInAppengine; From ca3ac77fb6e01a432cf94ad49a7261f38b69b051 Mon Sep 17 00:00:00 2001 From: Istvan Soos Date: Fri, 18 Apr 2025 16:08:10 +0200 Subject: [PATCH 2/4] documenting the env variable in Dockerfile --- Dockerfile.app | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Dockerfile.app b/Dockerfile.app index 178a4da740..9467ccfaf6 100644 --- a/Dockerfile.app +++ b/Dockerfile.app @@ -10,6 +10,8 @@ RUN apt-get update && \ # Let the pub server know that this is not a "typical" pub client but rather a bot. ENV PUB_ENVIRONMENT="bot.pub_dartlang_org.docker" ENV PUB_CACHE="/project/.pub-cache" +# Let the pub server know that it is running inside a container. +# It will not rebuild web-app assets, only assert their presence. ENV PUB_DEV_IN_CONTAINER="1" COPY app /project/app From 9df211a003124f4aec55125c55d43632e5023189 Mon Sep 17 00:00:00 2001 From: Istvan Soos Date: Fri, 18 Apr 2025 16:08:10 +0200 Subject: [PATCH 3/4] updates + changes based on the review --- Dockerfile.app | 2 +- app/lib/frontend/static_files.dart | 4 +++- app/lib/service/entrypoint/frontend.dart | 2 +- app/lib/shared/env_config.dart | 4 ++-- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Dockerfile.app b/Dockerfile.app index 9467ccfaf6..935b371d45 100644 --- a/Dockerfile.app +++ b/Dockerfile.app @@ -12,7 +12,7 @@ ENV PUB_ENVIRONMENT="bot.pub_dartlang_org.docker" ENV PUB_CACHE="/project/.pub-cache" # Let the pub server know that it is running inside a container. # It will not rebuild web-app assets, only assert their presence. -ENV PUB_DEV_IN_CONTAINER="1" +ENV PUB_DEV_ENVIRONMENT="production" COPY app /project/app COPY pkg /project/pkg diff --git a/app/lib/frontend/static_files.dart b/app/lib/frontend/static_files.dart index 479230e6b7..565b11759e 100644 --- a/app/lib/frontend/static_files.dart +++ b/app/lib/frontend/static_files.dart @@ -12,6 +12,7 @@ import 'package:meta/meta.dart'; import 'package:mime/mime.dart' as mime; import 'package:pana/pana.dart' show runConstrained; import 'package:path/path.dart' as path; +import 'package:pub_dev/shared/monitoring.dart'; final _logger = Logger('pub.static_files'); @@ -354,7 +355,8 @@ Future assertLocalBuiltFilesArePresent() async { Future assertExists(String path) async { final file = File(path); if (!file.existsSync()) { - throw AssertionError('`$path`` is missing.'); + _logger.pubNoticeShout( + 'missing-built-file', 'The local built file is missing: $path'); } } diff --git a/app/lib/service/entrypoint/frontend.dart b/app/lib/service/entrypoint/frontend.dart index 46ec5f1523..50b33bfcff 100644 --- a/app/lib/service/entrypoint/frontend.dart +++ b/app/lib/service/entrypoint/frontend.dart @@ -41,7 +41,7 @@ class DefaultCommand extends Command { } Future _main() async { - if (envConfig.isInContainer) { + if (envConfig.isInProductionEnvironment) { await assertLocalBuiltFilesArePresent(); } else { await updateLocalBuiltFilesIfNeeded(); diff --git a/app/lib/shared/env_config.dart b/app/lib/shared/env_config.dart index c34af2c277..9ff72f58bb 100644 --- a/app/lib/shared/env_config.dart +++ b/app/lib/shared/env_config.dart @@ -54,8 +54,8 @@ class _EnvConfig { bool get isRunningInAppengine => _gaeService != null && _gaeVersion != null; /// True, if the application is running inside a container environment. - late final isInContainer = - Platform.environment['PUB_DEV_IN_CONTAINER'] == '1'; + late final isInProductionEnvironment = + Platform.environment['PUB_DEV_ENVIRONMENT'] == 'production'; /// True, if running locally and not inside AppEngine. bool get isRunningLocally => !isRunningInAppengine; From 5b33e20480583d8a4e9a5b08f1f3d1106ca8f8d8 Mon Sep 17 00:00:00 2001 From: Istvan Soos Date: Fri, 18 Apr 2025 16:08:10 +0200 Subject: [PATCH 4/4] Also report missing SDK index.json --- app/lib/search/backend.dart | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/lib/search/backend.dart b/app/lib/search/backend.dart index 7688f68406..2aabbf3981 100644 --- a/app/lib/search/backend.dart +++ b/app/lib/search/backend.dart @@ -19,6 +19,7 @@ import 'package:meta/meta.dart'; import 'package:pana/src/dartdoc/pub_dartdoc_data.dart'; import 'package:path/path.dart' as p; import 'package:pool/pool.dart'; +import 'package:pub_dev/shared/env_config.dart'; import 'package:pub_dev/shared/monitoring.dart'; import 'package:retry/retry.dart'; @@ -451,6 +452,9 @@ class SearchBackend { } if (canUseCached) { return await file.readAsString(); + } else if (envConfig.isInProductionEnvironment) { + _logger.pubNoticeShout('missing-sdk-index-json', + 'The SDK index.json file is missing: fileName'); } }