Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions apps/cli/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## NEXT

- fix: Pass `flutter_assets` to backend when using `celest deploy`

## 1.0.10+2

- chore: Add back Sentry integration
Expand Down
61 changes: 46 additions & 15 deletions apps/cli/lib/src/frontend/celest_frontend.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ import 'dart:async';
import 'dart:io' as io show Platform;
import 'dart:io';
import 'dart:math';
import 'dart:typed_data';

import 'package:archive/archive_io.dart';
import 'package:async/async.dart';
import 'package:celest_ast/celest_ast.dart' as ast;
import 'package:celest_ast/celest_ast.dart' hide Sdk;
Expand Down Expand Up @@ -741,6 +743,7 @@ final class CelestFrontend {
});
final (deployedProject, baseUri) = await _deployProject(
environmentName: environment.name,
environmentId: environment.projectEnvironmentId,
resolvedProject: resolvedProject,
);
await _generateClientCode(
Expand Down Expand Up @@ -994,31 +997,59 @@ final class CelestFrontend {
return cloudEnvironment;
}

Future<Uint8List> _tarGzDirectory(String path) async {
final encoder = TarFileEncoder();
final tarFile = fileSystem.file(
p.join(projectPaths.projectCacheDir, '${p.basename(path)}.tar'),
);
await encoder.tarDirectory(
fileSystem.directory(path),
followLinks: false,
filename: tarFile.path,
);
final tarStream = tarFile.openRead();
return collectBytes(tarStream.transform(gzip.encoder));
}

Future<(ast.ResolvedProject, Uri)> _deployProject({
required String environmentName,
required String environmentId,
required ast.ResolvedProject resolvedProject,
}) =>
performance.trace('CelestFrontend', 'deployProject', () async {
final entrypointCompiler = EntrypointCompiler(
logger: logger,
verbose: verbose,
enabledExperiments: celestProject.analysisOptions.enabledExperiments,
);
final kernel = await entrypointCompiler.compile(
await _writeProjectOutputs(
resolvedProject: resolvedProject,
entrypointPath: projectPaths.localApiEntrypoint,
environmentId: environmentId,
);
final (kernelBytes, flutterAssetBytes) = await (
fileSystem
.directory(projectPaths.buildDir)
.childFile('main.aot.dill')
.readAsBytes(),
switch (resolvedProject.sdkConfig.targetSdk) {
ast.SdkType.flutter => _tarGzDirectory(
p.join(projectPaths.buildDir, 'flutter_assets'),
),
_ => Future.value(Uint8List(0)),
},
).wait;
final assets = [
pb.ProjectAsset(
type: pb.ProjectAsset_Type.DART_KERNEL,
filename: 'main.aot.dill',
inline: kernelBytes,
),
if (resolvedProject.sdkConfig.targetSdk == ast.SdkType.flutter)
pb.ProjectAsset(
type: pb.ProjectAsset_Type.FLUTTER_ASSETS,
filename: 'flutter_assets.tar.gz',
inline: flutterAssetBytes,
),
];
final operation = cloud.projects.environments.deploy(
environmentName,
resolvedProject: resolvedProject.toProto(),
assets: [
pb.ProjectAsset(
type: pb.ProjectAsset_Type.DART_KERNEL,
etag: kernel.outputDillDigest.toString(),
filename: p.basename(kernel.outputDillPath),
inline: kernel.outputDill,
),
],
assets: assets,
);
final waiter = CloudCliOperation(
operation,
Expand Down
4 changes: 4 additions & 0 deletions packages/celest_cloud/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
# 0.1.7-wip

- feat: Add `ProjectAsset.FLUTTER_ASSETS`

# 0.1.6

- feat: Add `ProjectEnvironment.uri` field
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion packages/celest_cloud/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: celest_cloud
description: API contracts and Dart clients for the Celest Cloud platform.
version: 0.1.6
version: 0.1.7-wip
repository: https://github.com/celest-dev/celest

environment:
Expand Down
3 changes: 3 additions & 0 deletions proto/celest/cloud/v1alpha1/project_environments.proto
Original file line number Diff line number Diff line change
Expand Up @@ -347,6 +347,9 @@ message ProjectAsset {

// The asset is a Dart kernel file.
DART_KERNEL = 1;

// The asset is a flutter_assets bundle.
FLUTTER_ASSETS = 2;
}

// The type of the asset.
Expand Down
1 change: 1 addition & 0 deletions services/celest_cloud_hub/bin/deploy_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@ Future<void> main() async {
),
),
kernelAsset: bytes,
flutterAssetsBundle: null,
environment: environment,
);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import 'dart:isolate';
import 'dart:math';
import 'dart:typed_data';

import 'package:archive/archive_io.dart';
import 'package:celest_ast/celest_ast.dart'
show ResolvedCelestDatabaseConfig, ResolvedProject;
import 'package:celest_cli/src/codegen/api/dockerfile_generator.dart';
Expand Down Expand Up @@ -33,6 +34,7 @@ final class FlyDeploymentEngine {
required String flyApiToken,
required this.projectAst,
required this.kernelAsset,
required this.flutterAssetsBundle,
required this.environment,
}) : flyApi = FlyMachinesApiClient(authToken: flyApiToken),
_flyApiToken = flyApiToken;
Expand All @@ -44,6 +46,7 @@ final class FlyDeploymentEngine {
final ProjectEnvironment environment;
final ResolvedProject projectAst;
final Uint8List kernelAsset;
final Uint8List? flutterAssetsBundle;

static Future<void> deployIsolated({
required String operationId,
Expand All @@ -52,6 +55,7 @@ final class FlyDeploymentEngine {
required ResolvedProject projectAst,
required ProjectEnvironment environment,
required Uint8List kernelAsset,
required Uint8List? flutterAssetsBundle,
}) async {
await Isolate.run(() async {
Logger.root.level = Level.ALL;
Expand Down Expand Up @@ -79,6 +83,7 @@ final class FlyDeploymentEngine {
flyApiToken: flyApiToken,
projectAst: projectAst,
kernelAsset: kernelAsset,
flutterAssetsBundle: flutterAssetsBundle,
environment: environment,
);
try {
Expand Down Expand Up @@ -253,6 +258,16 @@ final class FlyDeploymentEngine {
final kernelFile = dir.childFile('main.aot.dill');
await kernelFile.writeAsBytes(kernelAsset);

if (flutterAssetsBundle != null) {
// Write the Flutter assets bundle to disk
final flutterAssetsFile = dir.childFile('flutter_assets.tar.gz');
await flutterAssetsFile.writeAsBytes(flutterAssetsBundle!);
await extractFileToDisk(
flutterAssetsFile.path,
dir.childDirectory('flutter_assets').path,
);
}

// Write celest.json to disk
final celestJsonFile = dir.childFile('celest.json');
await celestJsonFile.writeAsString(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ import 'package:celest_cloud_hub/src/model/protobuf.dart';
import 'package:celest_cloud_hub/src/model/type_registry.dart';
import 'package:celest_cloud_hub/src/services/service_mixin.dart';
import 'package:celest_core/celest_core.dart';
import 'package:collection/collection.dart';
import 'package:drift/drift.dart';
import 'package:drift/isolate.dart';
import 'package:grpc/grpc.dart';
Expand Down Expand Up @@ -449,12 +448,12 @@ final class ProjectEnvironmentsService extends ProjectEnvironmentsServiceBase
resource: EntityUid.of('Celest::Project::Environment', environment.id),
);

final kernelAsset = request.assets.firstWhereOrNull(
(asset) => asset.type == pb.ProjectAsset_Type.DART_KERNEL,
);
final assets = {for (final asset in request.assets) asset.type: asset};
final kernelAsset = assets[pb.ProjectAsset_Type.DART_KERNEL];
if (kernelAsset == null) {
throw GrpcError.invalidArgument('Missing Dart kernel asset');
}
final flutterAssetsBundle = assets[pb.ProjectAsset_Type.FLUTTER_ASSETS];

final operationId = typeId('op');
final operation =
Expand All @@ -473,6 +472,12 @@ final class ProjectEnvironmentsService extends ProjectEnvironmentsServiceBase
pb.ResolvedProject().unpackAny(request.resolvedProjectAst),
),
kernelAsset: Uint8List.fromList(kernelAsset.inline).asUnmodifiableView(),
flutterAssetsBundle:
flutterAssetsBundle != null
? Uint8List.fromList(
flutterAssetsBundle.inline,
).asUnmodifiableView()
: null,
environment: environment,
);
unawaited(
Expand Down
1 change: 1 addition & 0 deletions services/celest_cloud_hub/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ environment:
resolution: workspace

dependencies:
archive: ^4.0.6
async: ^2.13.0
cedar: ^0.2.4
celest: ^1.0.0
Expand Down