Skip to content

Commit 7f8a702

Browse files
authored
fix: Pass flutter_assets to backend during deploy (#335)
When deploying Flutter projects to the cloud, ensure that the `flutter_assets` dir is passed to the backend as well.
1 parent 60886e3 commit 7f8a702

File tree

11 files changed

+91
-22
lines changed

11 files changed

+91
-22
lines changed

apps/cli/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## NEXT
2+
3+
- fix: Pass `flutter_assets` to backend when using `celest deploy`
4+
15
## 1.0.10+2
26

37
- chore: Add back Sentry integration

apps/cli/lib/src/frontend/celest_frontend.dart

Lines changed: 46 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ import 'dart:async';
22
import 'dart:io' as io show Platform;
33
import 'dart:io';
44
import 'dart:math';
5+
import 'dart:typed_data';
56

7+
import 'package:archive/archive_io.dart';
68
import 'package:async/async.dart';
79
import 'package:celest_ast/celest_ast.dart' as ast;
810
import 'package:celest_ast/celest_ast.dart' hide Sdk;
@@ -741,6 +743,7 @@ final class CelestFrontend {
741743
});
742744
final (deployedProject, baseUri) = await _deployProject(
743745
environmentName: environment.name,
746+
environmentId: environment.projectEnvironmentId,
744747
resolvedProject: resolvedProject,
745748
);
746749
await _generateClientCode(
@@ -994,31 +997,59 @@ final class CelestFrontend {
994997
return cloudEnvironment;
995998
}
996999

1000+
Future<Uint8List> _tarGzDirectory(String path) async {
1001+
final encoder = TarFileEncoder();
1002+
final tarFile = fileSystem.file(
1003+
p.join(projectPaths.projectCacheDir, '${p.basename(path)}.tar'),
1004+
);
1005+
await encoder.tarDirectory(
1006+
fileSystem.directory(path),
1007+
followLinks: false,
1008+
filename: tarFile.path,
1009+
);
1010+
final tarStream = tarFile.openRead();
1011+
return collectBytes(tarStream.transform(gzip.encoder));
1012+
}
1013+
9971014
Future<(ast.ResolvedProject, Uri)> _deployProject({
9981015
required String environmentName,
1016+
required String environmentId,
9991017
required ast.ResolvedProject resolvedProject,
10001018
}) =>
10011019
performance.trace('CelestFrontend', 'deployProject', () async {
1002-
final entrypointCompiler = EntrypointCompiler(
1003-
logger: logger,
1004-
verbose: verbose,
1005-
enabledExperiments: celestProject.analysisOptions.enabledExperiments,
1006-
);
1007-
final kernel = await entrypointCompiler.compile(
1020+
await _writeProjectOutputs(
10081021
resolvedProject: resolvedProject,
1009-
entrypointPath: projectPaths.localApiEntrypoint,
1022+
environmentId: environmentId,
10101023
);
1024+
final (kernelBytes, flutterAssetBytes) = await (
1025+
fileSystem
1026+
.directory(projectPaths.buildDir)
1027+
.childFile('main.aot.dill')
1028+
.readAsBytes(),
1029+
switch (resolvedProject.sdkConfig.targetSdk) {
1030+
ast.SdkType.flutter => _tarGzDirectory(
1031+
p.join(projectPaths.buildDir, 'flutter_assets'),
1032+
),
1033+
_ => Future.value(Uint8List(0)),
1034+
},
1035+
).wait;
1036+
final assets = [
1037+
pb.ProjectAsset(
1038+
type: pb.ProjectAsset_Type.DART_KERNEL,
1039+
filename: 'main.aot.dill',
1040+
inline: kernelBytes,
1041+
),
1042+
if (resolvedProject.sdkConfig.targetSdk == ast.SdkType.flutter)
1043+
pb.ProjectAsset(
1044+
type: pb.ProjectAsset_Type.FLUTTER_ASSETS,
1045+
filename: 'flutter_assets.tar.gz',
1046+
inline: flutterAssetBytes,
1047+
),
1048+
];
10111049
final operation = cloud.projects.environments.deploy(
10121050
environmentName,
10131051
resolvedProject: resolvedProject.toProto(),
1014-
assets: [
1015-
pb.ProjectAsset(
1016-
type: pb.ProjectAsset_Type.DART_KERNEL,
1017-
etag: kernel.outputDillDigest.toString(),
1018-
filename: p.basename(kernel.outputDillPath),
1019-
inline: kernel.outputDill,
1020-
),
1021-
],
1052+
assets: assets,
10221053
);
10231054
final waiter = CloudCliOperation(
10241055
operation,

packages/celest_cloud/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
# 0.1.7-wip
2+
3+
- feat: Add `ProjectAsset.FLUTTER_ASSETS`
4+
15
# 0.1.6
26

37
- feat: Add `ProjectEnvironment.uri` field

packages/celest_cloud/lib/src/proto/celest/cloud/v1alpha1/project_environments.pbenum.dart

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/celest_cloud/lib/src/proto/celest/cloud/v1alpha1/project_environments.pbjson.dart

Lines changed: 4 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/celest_cloud/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: celest_cloud
22
description: API contracts and Dart clients for the Celest Cloud platform.
3-
version: 0.1.6
3+
version: 0.1.7-wip
44
repository: https://github.com/celest-dev/celest
55

66
environment:

proto/celest/cloud/v1alpha1/project_environments.proto

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,9 @@ message ProjectAsset {
347347

348348
// The asset is a Dart kernel file.
349349
DART_KERNEL = 1;
350+
351+
// The asset is a flutter_assets bundle.
352+
FLUTTER_ASSETS = 2;
350353
}
351354

352355
// The type of the asset.

services/celest_cloud_hub/bin/deploy_test.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ Future<void> main() async {
111111
),
112112
),
113113
kernelAsset: bytes,
114+
flutterAssetsBundle: null,
114115
environment: environment,
115116
);
116117

services/celest_cloud_hub/lib/src/deploy/fly/fly_deployment_engine.dart

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import 'dart:isolate';
55
import 'dart:math';
66
import 'dart:typed_data';
77

8+
import 'package:archive/archive_io.dart';
89
import 'package:celest_ast/celest_ast.dart'
910
show ResolvedCelestDatabaseConfig, ResolvedProject;
1011
import 'package:celest_cli/src/codegen/api/dockerfile_generator.dart';
@@ -33,6 +34,7 @@ final class FlyDeploymentEngine {
3334
required String flyApiToken,
3435
required this.projectAst,
3536
required this.kernelAsset,
37+
required this.flutterAssetsBundle,
3638
required this.environment,
3739
}) : flyApi = FlyMachinesApiClient(authToken: flyApiToken),
3840
_flyApiToken = flyApiToken;
@@ -44,6 +46,7 @@ final class FlyDeploymentEngine {
4446
final ProjectEnvironment environment;
4547
final ResolvedProject projectAst;
4648
final Uint8List kernelAsset;
49+
final Uint8List? flutterAssetsBundle;
4750

4851
static Future<void> deployIsolated({
4952
required String operationId,
@@ -52,6 +55,7 @@ final class FlyDeploymentEngine {
5255
required ResolvedProject projectAst,
5356
required ProjectEnvironment environment,
5457
required Uint8List kernelAsset,
58+
required Uint8List? flutterAssetsBundle,
5559
}) async {
5660
await Isolate.run(() async {
5761
Logger.root.level = Level.ALL;
@@ -79,6 +83,7 @@ final class FlyDeploymentEngine {
7983
flyApiToken: flyApiToken,
8084
projectAst: projectAst,
8185
kernelAsset: kernelAsset,
86+
flutterAssetsBundle: flutterAssetsBundle,
8287
environment: environment,
8388
);
8489
try {
@@ -253,6 +258,16 @@ final class FlyDeploymentEngine {
253258
final kernelFile = dir.childFile('main.aot.dill');
254259
await kernelFile.writeAsBytes(kernelAsset);
255260

261+
if (flutterAssetsBundle != null) {
262+
// Write the Flutter assets bundle to disk
263+
final flutterAssetsFile = dir.childFile('flutter_assets.tar.gz');
264+
await flutterAssetsFile.writeAsBytes(flutterAssetsBundle!);
265+
await extractFileToDisk(
266+
flutterAssetsFile.path,
267+
dir.childDirectory('flutter_assets').path,
268+
);
269+
}
270+
256271
// Write celest.json to disk
257272
final celestJsonFile = dir.childFile('celest.json');
258273
await celestJsonFile.writeAsString(

services/celest_cloud_hub/lib/src/services/project_environments_service.dart

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import 'package:celest_cloud_hub/src/model/protobuf.dart';
2222
import 'package:celest_cloud_hub/src/model/type_registry.dart';
2323
import 'package:celest_cloud_hub/src/services/service_mixin.dart';
2424
import 'package:celest_core/celest_core.dart';
25-
import 'package:collection/collection.dart';
2625
import 'package:drift/drift.dart';
2726
import 'package:drift/isolate.dart';
2827
import 'package:grpc/grpc.dart';
@@ -449,12 +448,12 @@ final class ProjectEnvironmentsService extends ProjectEnvironmentsServiceBase
449448
resource: EntityUid.of('Celest::Project::Environment', environment.id),
450449
);
451450

452-
final kernelAsset = request.assets.firstWhereOrNull(
453-
(asset) => asset.type == pb.ProjectAsset_Type.DART_KERNEL,
454-
);
451+
final assets = {for (final asset in request.assets) asset.type: asset};
452+
final kernelAsset = assets[pb.ProjectAsset_Type.DART_KERNEL];
455453
if (kernelAsset == null) {
456454
throw GrpcError.invalidArgument('Missing Dart kernel asset');
457455
}
456+
final flutterAssetsBundle = assets[pb.ProjectAsset_Type.FLUTTER_ASSETS];
458457

459458
final operationId = typeId('op');
460459
final operation =
@@ -473,6 +472,12 @@ final class ProjectEnvironmentsService extends ProjectEnvironmentsServiceBase
473472
pb.ResolvedProject().unpackAny(request.resolvedProjectAst),
474473
),
475474
kernelAsset: Uint8List.fromList(kernelAsset.inline).asUnmodifiableView(),
475+
flutterAssetsBundle:
476+
flutterAssetsBundle != null
477+
? Uint8List.fromList(
478+
flutterAssetsBundle.inline,
479+
).asUnmodifiableView()
480+
: null,
476481
environment: environment,
477482
);
478483
unawaited(

0 commit comments

Comments
 (0)