Skip to content

Commit 8049658

Browse files
author
serverpod_cloud
committed
feat(console): 904eaeeeb8e0caefba8f9a550b44d7376a3dd243
1 parent 2ffdbdd commit 8049658

5 files changed

Lines changed: 114 additions & 36 deletions

File tree

ground_control_client/lib/src/protocol/client.dart

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -761,10 +761,13 @@ class EndpointDeploy extends _i1.EndpointRef {
761761
@override
762762
String get name => 'deploy';
763763

764-
_i2.Future<String> createUploadDescription(String cloudProjectId) =>
765-
caller.callServerEndpoint<String>('deploy', 'createUploadDescription', {
766-
'cloudProjectId': cloudProjectId,
767-
});
764+
_i2.Future<String> createUploadDescription(
765+
String cloudProjectId, {
766+
String? serverpodVersion,
767+
}) => caller.callServerEndpoint<String>('deploy', 'createUploadDescription', {
768+
'cloudProjectId': cloudProjectId,
769+
'serverpodVersion': serverpodVersion,
770+
});
768771
}
769772

770773
/// Endpoint for managing environment variables.

serverpod_cloud_cli/lib/commands/deploy/deploy.dart

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@ import 'dart:io';
33
import 'package:dio/dio.dart';
44
import 'package:ground_control_client/ground_control_client.dart';
55
import 'package:serverpod_cloud_cli/command_logger/command_logger.dart';
6-
import 'package:serverpod_cloud_cli/shared/exceptions/exit_exceptions.dart';
76
import 'package:serverpod_cloud_cli/command_runner/helpers/file_uploader_factory.dart';
8-
import 'package:serverpod_cloud_cli/project_zipper/project_zipper_exceptions.dart';
7+
import 'package:serverpod_cloud_cli/commands/deploy/script_runner.dart';
98
import 'package:serverpod_cloud_cli/project_zipper/project_zipper.dart';
9+
import 'package:serverpod_cloud_cli/project_zipper/project_zipper_exceptions.dart';
10+
import 'package:serverpod_cloud_cli/shared/exceptions/exit_exceptions.dart';
1011
import 'package:serverpod_cloud_cli/util/pubspec_validator.dart';
1112
import 'package:serverpod_cloud_cli/util/scloud_config/scloud_config_io.dart';
1213
import 'package:serverpod_cloud_cli/util/scloudignore.dart' show ScloudIgnore;
13-
import 'package:serverpod_cloud_cli/commands/deploy/script_runner.dart';
1414

1515
import 'prepare_workspace.dart';
1616

@@ -154,10 +154,15 @@ abstract class Deploy {
154154
} else {
155155
late final String uploadDescription;
156156

157+
final serverpodVersion = pubspecValidator.serverpodVersion;
158+
157159
await logger.progress('Retrieving upload description...', () async {
158160
try {
159161
uploadDescription = await cloudApiClient.deploy
160-
.createUploadDescription(projectId);
162+
.createUploadDescription(
163+
projectId,
164+
serverpodVersion: serverpodVersion,
165+
);
161166
return true;
162167
} on ServerpodClientException catch (e) {
163168
if (e.message.toLowerCase().contains('connection timed out')) {

serverpod_cloud_cli/lib/util/pubspec_validator.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,16 @@ class TenantProjectPubspec {
9696
pubspec.dependencies['serverpod'] != null;
9797
}
9898

99+
/// Returns the Serverpod framework version constraint string,
100+
/// or null if no Serverpod hosted dependency is found.
101+
String? get serverpodVersion {
102+
final serverpodDep = pubspec.dependencies['serverpod'];
103+
if (serverpodDep is HostedDependency) {
104+
return serverpodDep.version.toString();
105+
}
106+
return null;
107+
}
108+
99109
/// Validates the pubspec.yaml dependencies of a customer project
100110
/// in order to be deployed to Serverpod Cloud.
101111
///

serverpod_cloud_cli/test_integration/commands/deploy_command_test.dart

Lines changed: 78 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,17 @@ import 'dart:io';
88
import 'package:archive/archive.dart';
99
import 'package:archive/archive_io.dart';
1010
import 'package:args/command_runner.dart';
11+
import 'package:ground_control_client/ground_control_client.dart';
12+
import 'package:ground_control_client/ground_control_client_test_tools.dart';
1113
import 'package:mocktail/mocktail.dart';
1214
import 'package:path/path.dart' as p;
13-
import 'package:serverpod_cloud_cli/constants.dart' show VersionConstants;
14-
import 'package:test_descriptor/test_descriptor.dart' as d;
15-
import 'package:test/test.dart';
16-
17-
import 'package:ground_control_client/ground_control_client_test_tools.dart';
18-
import 'package:ground_control_client/ground_control_client.dart';
1915
import 'package:serverpod_cloud_cli/command_runner/cloud_cli_command_runner.dart';
2016
import 'package:serverpod_cloud_cli/command_runner/commands/deploy_command.dart';
21-
import 'package:serverpod_cloud_cli/shared/exceptions/exit_exceptions.dart';
2217
import 'package:serverpod_cloud_cli/command_runner/helpers/cloud_cli_service_provider.dart';
18+
import 'package:serverpod_cloud_cli/constants.dart' show VersionConstants;
19+
import 'package:serverpod_cloud_cli/shared/exceptions/exit_exceptions.dart';
20+
import 'package:test/test.dart';
21+
import 'package:test_descriptor/test_descriptor.dart' as d;
2322
import 'package:yaml_codec/yaml_codec.dart';
2423

2524
import '../../test_utils/bucket_upload_description.dart';
@@ -58,7 +57,10 @@ void main() {
5857
await ProjectFactory.serverpodServerDir().create();
5958

6059
when(
61-
() => client.deploy.createUploadDescription(any()),
60+
() => client.deploy.createUploadDescription(
61+
any(),
62+
serverpodVersion: any(named: 'serverpodVersion'),
63+
),
6264
).thenThrow(ServerpodClientUnauthorized());
6365
});
6466

@@ -260,7 +262,10 @@ dependencies:
260262
group('and 403 response for creating file upload request', () {
261263
setUp(() async {
262264
when(
263-
() => client.deploy.createUploadDescription(any()),
265+
() => client.deploy.createUploadDescription(
266+
any(),
267+
serverpodVersion: any(named: 'serverpodVersion'),
268+
),
264269
).thenThrow(ServerpodClientForbidden());
265270
});
266271

@@ -303,7 +308,12 @@ dependencies:
303308
'and valid upload description response and the project directory contains directory symlink',
304309
() {
305310
setUp(() async {
306-
when(() => client.deploy.createUploadDescription(any())).thenAnswer(
311+
when(
312+
() => client.deploy.createUploadDescription(
313+
any(),
314+
serverpodVersion: any(named: 'serverpodVersion'),
315+
),
316+
).thenAnswer(
307317
(final _) async => BucketUploadDescription.uploadDescription,
308318
);
309319

@@ -369,7 +379,12 @@ dependencies:
369379
'Given valid upload description response but project contains unresolved symlink',
370380
() {
371381
setUp(() async {
372-
when(() => client.deploy.createUploadDescription(any())).thenAnswer(
382+
when(
383+
() => client.deploy.createUploadDescription(
384+
any(),
385+
serverpodVersion: any(named: 'serverpodVersion'),
386+
),
387+
).thenAnswer(
373388
(final _) async => BucketUploadDescription.uploadDescription,
374389
);
375390

@@ -441,7 +456,10 @@ dependencies:
441456

442457
setUp(() async {
443458
when(
444-
() => client.deploy.createUploadDescription(any()),
459+
() => client.deploy.createUploadDescription(
460+
any(),
461+
serverpodVersion: any(named: 'serverpodVersion'),
462+
),
445463
).thenAnswer((final _) async => jsonEncode(descriptionContent));
446464

447465
mockFileUploader.init(uploadResponse: false);
@@ -484,7 +502,12 @@ dependencies:
484502

485503
group('and valid upload description response', () {
486504
setUp(() async {
487-
when(() => client.deploy.createUploadDescription(any())).thenAnswer(
505+
when(
506+
() => client.deploy.createUploadDescription(
507+
any(),
508+
serverpodVersion: any(named: 'serverpodVersion'),
509+
),
510+
).thenAnswer(
488511
(final _) async => BucketUploadDescription.uploadDescription,
489512
);
490513
});
@@ -517,7 +540,12 @@ dependencies:
517540
await ProjectFactory.serverpodServerDir().create();
518541
testProjectDir = p.join(d.sandbox, ProjectFactory.defaultDirectoryName);
519542

520-
when(() => client.deploy.createUploadDescription(any())).thenAnswer(
543+
when(
544+
() => client.deploy.createUploadDescription(
545+
any(),
546+
serverpodVersion: any(named: 'serverpodVersion'),
547+
),
548+
).thenAnswer(
521549
(final _) async => BucketUploadDescription.uploadDescription,
522550
);
523551
});
@@ -667,7 +695,12 @@ project:
667695
],
668696
).create();
669697

670-
when(() => client.deploy.createUploadDescription(any())).thenAnswer(
698+
when(
699+
() => client.deploy.createUploadDescription(
700+
any(),
701+
serverpodVersion: any(named: 'serverpodVersion'),
702+
),
703+
).thenAnswer(
671704
(final _) async => BucketUploadDescription.uploadDescription,
672705
);
673706
});
@@ -716,7 +749,12 @@ project:
716749
'''),
717750
]).create();
718751

719-
when(() => client.deploy.createUploadDescription(any())).thenAnswer(
752+
when(
753+
() => client.deploy.createUploadDescription(
754+
any(),
755+
serverpodVersion: any(named: 'serverpodVersion'),
756+
),
757+
).thenAnswer(
720758
(final _) async => BucketUploadDescription.uploadDescription,
721759
);
722760
});
@@ -788,7 +826,12 @@ dependencies:
788826
]),
789827
]).create();
790828

791-
when(() => client.deploy.createUploadDescription(any())).thenAnswer(
829+
when(
830+
() => client.deploy.createUploadDescription(
831+
any(),
832+
serverpodVersion: any(named: 'serverpodVersion'),
833+
),
834+
).thenAnswer(
792835
(final _) async => BucketUploadDescription.uploadDescription,
793836
);
794837
});
@@ -954,7 +997,12 @@ dependencies:
954997
]),
955998
]).create();
956999

957-
when(() => client.deploy.createUploadDescription(any())).thenAnswer(
1000+
when(
1001+
() => client.deploy.createUploadDescription(
1002+
any(),
1003+
serverpodVersion: any(named: 'serverpodVersion'),
1004+
),
1005+
).thenAnswer(
9581006
(final _) async => BucketUploadDescription.uploadDescription,
9591007
);
9601008
});
@@ -1018,7 +1066,12 @@ dev_dependencies:
10181066
]).create();
10191067
testProjectDir = p.join(d.sandbox, 'project');
10201068

1021-
when(() => client.deploy.createUploadDescription(any())).thenAnswer(
1069+
when(
1070+
() => client.deploy.createUploadDescription(
1071+
any(),
1072+
serverpodVersion: any(named: 'serverpodVersion'),
1073+
),
1074+
).thenAnswer(
10221075
(final _) async => BucketUploadDescription.uploadDescription,
10231076
);
10241077
});
@@ -1067,7 +1120,12 @@ dev_dependencies:
10671120
await ProjectFactory.serverpodServerDir().create();
10681121
testProjectDir = p.join(d.sandbox, ProjectFactory.defaultDirectoryName);
10691122

1070-
when(() => client.deploy.createUploadDescription(any())).thenAnswer(
1123+
when(
1124+
() => client.deploy.createUploadDescription(
1125+
any(),
1126+
serverpodVersion: any(named: 'serverpodVersion'),
1127+
),
1128+
).thenAnswer(
10711129
(final _) async => BucketUploadDescription.uploadDescription,
10721130
);
10731131
});

serverpod_cloud_cli/test_integration/commands/launch_command_test.dart

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,17 @@ library;
44
import 'dart:async';
55
import 'dart:convert';
66

7-
import 'package:mocktail/mocktail.dart';
8-
import 'package:path/path.dart' as p;
9-
import 'package:serverpod_cloud_cli/constants.dart' show VersionConstants;
10-
import 'package:test_descriptor/test_descriptor.dart' as d;
11-
import 'package:test/test.dart';
12-
137
import 'package:ground_control_client/ground_control_client.dart';
148
import 'package:ground_control_client/ground_control_client_test_tools.dart';
9+
import 'package:mocktail/mocktail.dart';
10+
import 'package:path/path.dart' as p;
1511
import 'package:serverpod_cloud_cli/command_runner/cloud_cli_command_runner.dart';
1612
import 'package:serverpod_cloud_cli/command_runner/commands/launch_command.dart';
17-
import 'package:serverpod_cloud_cli/shared/exceptions/exit_exceptions.dart';
1813
import 'package:serverpod_cloud_cli/command_runner/helpers/cloud_cli_service_provider.dart';
14+
import 'package:serverpod_cloud_cli/constants.dart' show VersionConstants;
15+
import 'package:serverpod_cloud_cli/shared/exceptions/exit_exceptions.dart';
16+
import 'package:test/test.dart';
17+
import 'package:test_descriptor/test_descriptor.dart' as d;
1918

2019
import '../../test_utils/command_logger_matchers.dart';
2120
import '../../test_utils/project_factory.dart';
@@ -108,7 +107,10 @@ void main() {
108107
).thenAnswer((final _) async => {});
109108

110109
when(
111-
() => client.deploy.createUploadDescription(any()),
110+
() => client.deploy.createUploadDescription(
111+
any(),
112+
serverpodVersion: any(named: 'serverpodVersion'),
113+
),
112114
).thenAnswer((final _) async => jsonEncode(descriptionContent));
113115

114116
final attemptStages = [

0 commit comments

Comments
 (0)